扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
利用php的系统调用,开启新的进程来实现。
主要从事网页设计、PC网站建设(电脑版网站建设)、wap网站建设(手机版网站建设)、成都响应式网站建设、程序开发、微网站、成都小程序开发等,凭借多年来在互联网的打拼,我们在互联网网站建设行业积累了丰富的网站建设、成都网站制作、网络营销经验,集策划、开发、设计、营销、管理等多方位专业化运作于一体,具备承接不同规模与类型的建设项目的能力。
php
提供了fsockopen函数,此函数的功能为初始化一个套接字连接到指定主机,默认情况下将以阻塞模式开启套接字连接。当然你可以通过stream_set_blocking()将它转换到非阻塞模式。这是关键。所以,思路就是:开启一个非阻塞的套接字连接到本机,本机收到之后作一些耗时处理。
首先,队列的作用不是批量处理,而是延时处理,也叫异步处理
要做批量采集的话,首先你要划分好区间,可以用php的多进程,也可以用php的cli模式做,只要数据不窜就行
没看到你的全选按纽呢?
不过这个问题 跟php代码没关系哈
你先做下静态的全选功能吧
使用Ajax 与 img 标记
原理,服务器返回的html中插入Ajax 代码或 img 标记,img的src为需要执行的程序。
优点:实现简单,服务端无需执行任何调用
缺点:在执行期间,浏览器会一直处于loading状态,因此这种方法并不算真正的异步调用。
$.get("doRequest.php", { name: "fdipzone"} );
img src="doRequest.php?name=fdipzone"
使用popen
使用popen执行命令,语法:
优点:执行速度快
缺点:
1).只能在本机执行
2).不能传递大量参数
3).访问量高时会创建很多进程
// popen — 打开进程文件指针
resource popen ( string $command , string $mode )
pclose(popen('php /home/fdipzone/doRequest.php ', 'r'));
使用curl
设置curl的超时时间 CURLOPT_TIMEOUT 为1 (最小为1),因此客户端需要等待1秒
?php
$ch = curl_init();
$curl_opt = array(
CURLOPT_URL, ''
CURLOPT_RETURNTRANSFER,1,
CURLOPT_TIMEOUT,1
);
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);
?
使用fsockopen
fsockopen是最好的,缺点是需要自己拼接header部分。
?php
$url = '';
$param = array(
'name'='fdipzone',
'gender'='male',
'age'=30
);
doRequest($url, $param);
function doRequest($url, $param=array()){
$urlinfo = parse_url($url);
$host = $urlinfo['host'];
$path = $urlinfo['path'];
$query = isset($param)? http_build_query($param) : '';
$port = 80;
$errno = 0;
$errstr = '';
$timeout = 10;
$fp = fsockopen($host, $port, $errno, $errstr, $timeout);
$out = "POST ".$path." HTTP/1.1\r\n";
$out .= "host:".$host."\r\n";
$out .= "content-length:".strlen($query)."\r\n";
$out .= "content-type:application/x-www-form-urlencoded\r\n";
$out .= "connection:close\r\n\r\n";
$out .= $query;
fputs($fp, $out);
fclose($fp);
}
?
注意:当执行过程中,客户端连接断开或连接超时,都会有可能造成执行不完整,因此需要加上
ignore_user_abort(true); // 忽略客户端断开
set_time_limit(0); // 设置执行不超时
client:
?php
$client=newGearmanClient();
$client-addServer('127.0.0.1', 4730);//本机可以直接addServer(),默认服务器端使用4730端口
$client-setCompleteCallback('completeCallBack');//先绑定才有效
$result1=$client-do('say','do');//do是同步进行,进行处理并返回处理结果。
$result2=$client-doBackground('say','doBackground');//异步进行,只返回处理句柄。
$result3=$client-addTask('say','addTask');//添加任务到队列,同步进行?通过添加task可以设置回调函数。
$result4=$client-addTaskBackground('say','addTaskBackground');//添加后台任务到队列,异步进行?
$client-runTasks();//运行队列中的任务,只是do系列不需要runTask()。
echo'result1:';
var_dump($result1);
echo'br/';
echo'result2:';
var_dump($result2);
echo'br/';
echo'result3:';
var_dump($result3);
echo'br/';
echo'result4:';
var_dump($result4);
echo'br/';
//绑定回调函数,只对addTask有效
functioncompleteCallBack($task)
{
echo'CompleteCallback!handle result:'.$task-data().'br/';
}
worker:
?php
$worker=newGearmanWorker();
$worker-addServer();
$worker-addFunction('say',function(GearmanJob$job){
$workload=$job-workload();//接收client传递的数据
echo'receive data:'.$workload.PHP_EOL;
returnstrrev($workload);//仅作反转处理
});
//无际循环运行,gearman内部已有处理,不会出现占用过高死掉的情况
while($worker-work()){
if($worker-returnCode() !== GEARMAN_SUCCESS){
echo'error'.PHP_EOL;
}
}
以上client输出:
CompleteCallback!handle result:ksaTdda
result1:string(2) “od”
result2:string(17) “H:iZ943bixttyZ:87″
result3:object(GearmanTask)#2 (0) { }
result4:object(GearmanTask)#3 (0) { }
worker输出:
receive data:do
receive data:doBackground
receive data:addTaskBackground
receive data:addTask
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流