推荐:《php视频教程》
php实现并发
使用场景
如果你第三方的多个接口,需要循环请求,这时候就需要并发处理,因为 php 是单进程,顺序执行的程序,如果有一个接口挂了,那么后面的接口也不能得到请求,或者某个接口等待时间过长,下面的接口也需要等待时间,那么十多个接口每个接口等待1s,十个接口就需要10s才能完成一次请求。这时候,就需要使用并发请求
使用方案
可以先写好针对某个第三方的请求接口,然后使用并发请求这些第三方的接口
并发代码
function request(){$srart_time = microtime(true);$websiteurl = 'http://test/';/** * 结算 */$alls = [ $websiteurl . "1.php", $websiteurl . "2.php",];//1 创建批处理curl句柄$chhandle = curl_multi_init();$charr = [];//2.创建多个curl资源foreach ($alls as $url) { $charr[$url] = curl_init(); curl_setopt($charr[$url], curlopt_url, $url); curl_setopt($charr[$url], curlopt_returntransfer, 1); curl_setopt($charr[$url], curlopt_timeout, 1); curl_multi_add_handle($chhandle, $charr[$url]); //2 增加句柄}$active = null;/**常量 * curlm_call_multi_perform==-1 * // curlm_ok == 0 **/do { $mrc = curl_multi_exec($chhandle, $active); //3 执行批处理句柄} while ($mrc == curlm_call_multi_perform); //4//4 $active 为true,即$chhandle批处理之中还有$ch句柄正待处理,$mrc==curlm_ok,即上一次$ch句柄的读取或写入已经执行完毕。while ($active && $mrc == curlm_ok) { if (curl_multi_select($chhandle) != curlm_call_multi_perform) {//$chhandle批处理中还有可执行的$ch句柄,curl_multi_select($chhandle) != -1程序退出阻塞状态。 do { $mrc = curl_multi_exec($chhandle, $active);//继续执行需要处理的$ch句柄。 } while ($mrc == curlm_call_multi_perform); }}foreach ($charr as $k => $ch) {// $result[$k] = curl_multi_getcontent($ch); //5 获取句柄的返回值,不需要 curl_multi_remove_handle($chhandle, $ch);//6 将$chhandle中的句柄移除}curl_multi_close($chhandle); //7 关闭全部句柄$end_time = microtime(true);echo sprintf("use time:%.3f s", $end_time - $srart_time);}
php 实现循环请求接口
这种情况针对的是循环需要在1s内执行的程序,如果执行频率超过1s,则直接使用linux 的计划任务即可
// 无时间限制执行此程序set_time_limit(0);// 设置默认时区 北京时间date_default_timezone_set('prc');do { // 如果不存在 stop 文件,则程序停止 并且记录停止时间 if (!file_exists(dirname(__file__) . '/stop')) { $handle = fopen('./ceshi.log', 'a+'); fwrite($handle, '程序停止时间: ' . date('y-m-d h:i:s') . "\n"); fclose($handle); exit(); } sleep(4); try { requestnewopen(); } catch (exception $exception) { $handle = fopen('./ceshi.log', 'a+'); fwrite($handle, 'catch : ' . $exception->getmessage() . "\n"); fclose($handle); }} while (true);
以上就是php如何实现并发的详细内容。
