php多线程并发是怎么实现的
java里多线程就是一个new thread的事情,php依赖apache靠着linux底层有一个多线程的办法。
今天说说如果你无法操控apache的服务器,如何模拟php并发
<?php
if(function_exists('date_default_timezone_set')) {
date_default_timezone_set('PRC');
}
function a()
{
$time = time();
sleep(3);
$fp = fopen('result_a'.$time.'.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
function b()
{
$time = time();
sleep(3);
$fp = fopen('result_b'.$time.'.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
a();
}
else if($_GET['act'] == 'b') b();
?>
以上代码,在本地写入一个文件。
如果你访问 localhost/a.php 在两个浏览器标签尽可能快的同时打开,发现两个文件创建时间相差为3秒
但是如果你访问localhost/a.php?act=b 另一个访问/a.php?act=a 你发现两个文件创建的时间几乎差不多。
对于apache来说同样的url意味着一个线程(我们或者说是进程),但是不同的URL意味着可以并发。
如果php内部有下载的动作
function runThread()
{
down("http://localhost/test/a.php?act=a");
}
if($_GET['act'] == 'run')
{
echo 'start:';
runThread();
echo ' End';
}
http://localhost/test/a.php?act=run
http://localhost/test/a.php?act=run&s=2
只要主访问的url不同,则认为是不同的进行,意味着并发。文件创建时间不为3秒
本地有Linux服务器的朋友也可以借助linux来进行模拟并发
<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>
上面存成test.php, 然后写一段SHELL代码
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done
不显示调试错误
之前没有开启之前,出现这样的错误提示,并不是我们希望的,这样没有给我们任何有意义的调试信息:
解决办法
在入口处统一设置如下代码即可:
ini_set("display_errors", "On");
error_reporting(E_ALL);
php.ini的话,代码如下:
找到display_errors = On 修改为 display_errors = off
下面我们来看一篇关于PHP “Notice: Undefined variable” 和 “Notice: Undefined index”报错,希望这篇文章能够帮助到各位朋友,有兴趣的朋友可以进来看看吧。
解决Notice: Undefined variable报错
虽然 PHP不需要预先声明变量,但是依然强烈推荐大家声明以避免因为忘记给变量赋值而引起的一些安全性漏洞及可能的BUG。所以PHP以非常低的报警级别(E_NOTICE)来提醒大家正在使用一个未声明的变量。
当然解决以上报错有如下几种方法,根据场景选择适合自己的:
1.(推荐)提前声明变量,例如当你想要为一个未声明的变量连接字符串的时候。或者使用isset()/!empty()来检查是否已经声明:
$value = ""; //初始化变量
//"" 当下面需要对其进行字符串操作时
//0 当下面需要对其数字操作时
//isset()
$value = isset($_POST['value']) ? $_POST['value'] : '';
//empty()
$value = !empty($_POST['value']) ? $_POST['value'] : '';
2.设置自定义的(error handler)来处理E_NOTICE错误
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
3.禁止E_NOTICE报警
error_reporting( error_reporting() & ~E_NOTICE )
强烈建议使用第一种方法
解决Notice: Undefined index报错
当你访问数组中尚未定义的索引时会出现 Undefined index问题。
1.在访问数组索引前检查是否存在,可以使用isset()或者array_key_exists()
//isset()
$value = isset($array['my_index']) ? $array['my_index'] : '';
//array_key_exists()
$value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
PHP中对数组的处理是最常用的必备技能之一。自己总结了一下几个最常用的处理数组的高级函数。
1. array_merge()
合并数组,将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面,最后返回一个数组。
关联数组:有相同的字符串键名时,则该键名后面的值将覆盖前一个值
索引数组:后面的值将不会覆盖原来的值,而是附加到后面
array array_merge (array array1 array2…,arrayN)
例子:
<?php
$a = array("a","b","c");
$b = array("1","2","3");
$c = array_merge($a, $b);
print_r($c);
// 输出结果
// Array ( [0] => a [1] => b [2] => c [3] => 1 [4] => 2 [5] => 3 )
?>
2. array_merge_recursive()
功能同array_merge(),只不过遇到相同值时处理方式不同
关联数组:有相同的字符串键名时,则该键值变成一个数组,将相同键值放在一个数组里
例子:
<?php
$a = array("a" => "123", "b" => "yes");
$b = array("c" => "no", "a" => "aaa");
$d = array_merge_recursive($a, $b);
print_r($d);
// 输出结果
// Array ( [a] => Array ( [0] => 123 [1] => aaa ) [b] => yes [c] => no )
?>
3. array_slice()
拆分索引数组,类似于substr()的用法, offset开始切,切length这么多个, 不设置length则是切到尾
array array_slice (array array, int offset[,int length])
例子:
<?php
$a = array("A", "B", "C", "D", "E", "F", "G");
$b = array_slice($a, 3);
print_r($b);
// 输出
// Array ( [0] => D [1] => E [2] => F [3] => G )
?>
4. array_multisort()
返回排序数组:
array_multisort(array1,sorting order,sorting type,array2,array3...)
这个函数功能很强大,有几个用法:
直接进行排序
<?php
$a1=array("Dog","Cat");
$a2=array("Fido","Missy");
array_multisort($a1,$a2);
print_r($a1);
print_r($a2);
// Array ( [0] => Cat [1] => Dog ) Array ( [0] => Missy [1] => Fido )
?>
设置排序方式进行排序
<?php
/* 设置倒序正序 */
$a1=array("Dog","Dog","Cat");
$a2=array("Pluto","Fido","Missy");
array_multisort($a1,SORT_ASC,$a2,SORT_DESC);
print_r($a1);
print_r($a2);
// Array ( [0] => Cat [1] => Dog [2] => Dog ) Array ( [0] => Missy [1] => Pluto [2] => Fido )
/* 设置倒序正序,排序标准 */
$a1=array(1,30,15,7,25);
$a2=array(4,30,20,41,66);
$num=array_merge($a1,$a2);
array_multisort($num,SORT_DESC,SORT_NUMERIC);
print_r($num);
// Array ( [0] => 66 [1] => 41 [2] => 30 [3] => 30 [4] => 25 [5] => 20 [6] => 15 [7] => 7 [8] => 4 [9] => 1 )
?>
二维数组根据某键值进行排序
<?php
/* time为要排序字段, SORT_DESC降序排列, $all要排序的数组 */
foreach ($all as $k => $v)
{
$time[] = $v['time'];
}
array_multisort($time, SORT_DESC, $all);
?>
5. array_intersect()和array_intersect_assoc()
array_intersect()返回一个保留了键的数组,这个数组只由第一个数组中出现的且在其他每个输入数组中都出现的值组成。
array_intersect_assoc()返回一个在第一个数组中出现,且在所有其他输入数组中也出现的键/值对组成的数组。
应用场景: 共同好友推荐
<?php
$a = array("Kevin","Mike","Jone");
$b = array("Jack","Kevin","Anna");
$c = array("Steven","Json","Kevin");
$output = array_intersect($a, $b, $c);
print_r($output);
// output
// Array ( [0] => Kevin )
?>
相关文章
基于springcloud异步线程池、高并发请求feign的解决方案
这篇文章主要介绍了基于springcloud异步线程池、高并发请求feign的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-25- php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
- PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
- 本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
- index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
jQuery+slidereveal实现的面板滑动侧边展出效果
我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15- 这篇文章主要为大家详细介绍了C#编程高并发的几种处理方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
SQLMAP结合Meterpreter实现注入渗透返回shell
sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25PHP中func_get_args(),func_get_arg(),func_num_args()的区别
复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04- 复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; }else if( $da == "2" ){ echo "今天是星期二"; }else if( $da == "3" ){ echo "今天是星期三"; }else if( $da == "4"...2013-10-04
- 这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
- 这篇文章主要介绍了解决线程并发redisson使用遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-18
- 这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
- js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/100(兼容FF和GG)。 先来看看设置透明度的兼容性代码: 复制代码 代码如下: function setOpacity(ele, opacity) { if (...2014-06-07
- 这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31- 这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13