PHP多线程
发布时间2022-12-29 21:15:28【PHP】11人已围观
简介 PHP默认是单线程,php如何实现多线程?
PHP多线程
PHP默认是单线程
如果需要实现多线程最早可使用 pthreads拓展 进行编写。但是只能用于CLI模式。
*警告*:不可以在 web 服务器环境中使用 pthreads 扩展, PHP 多线程开发仅限于命令行模式的应用。
原因众所周知,CGI模式下PHP是基于PHP-FPM多进程的并发模型。想要使用多线程到CGI,得自己写一套基于多线程的HTTP 并发服务。
而且此拓展已经不再维护,官方推荐使用 parallel拓展 进行代替。不过,parallel 仅支持PHP 7.2+ 版本。
还有一种使用curl_multi_init
/** * https 发起post多发请求 * @param array $nodes url和参数信息。 * $nodes = [ * [0] = > [ * 'url' => 'http://******', * 'data' => '{"a":1,"b":2}' * ], * [1] = > [ * 'url' => 'http://******', * 'data' => null * ] * .... * ]; * @param int $timeOut 超时设置 * @return 请求链接返回的数据,array数组 */ public static function postMulti($nodes, $timeOut = 5){ try { if (false == is_array($nodes)) { return []; } $mh = curl_multi_init(); $curlArray = array(); foreach ($nodes as $key => $info) { if (false == is_array($info)) { continue; } if (false == isset($info['url'])) { continue; } $ch = curl_init(); // 设置url $url = $info['url']; curl_setopt($ch, CURLOPT_URL, $url); $data = isset($info['data']) ? $info['data'] : null; if (false == empty($data)) { curl_setopt($ch, CURLOPT_POST, 1); // array if (is_array($data) && count($data) > 0) { curl_setopt($ch, CURLOPT_POST, count($data)); } curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 如果成功只将结果返回,不自动输出返回的内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // user-agent curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0"); // 超时 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeOut); $curlArray[$key] = $ch; curl_multi_add_handle($mh, $curlArray[$key]); } $running = NULL; do { usleep(10000); curl_multi_exec($mh, $running); } while ($running > 0); $res = []; foreach ($nodes as $key => $info) { $res[$key] = curl_multi_getcontent($curlArray[$key]); } foreach ($nodes as $key => $info) { curl_multi_remove_handle($mh, $curlArray[$key]); } curl_multi_close($mh); return $res; } catch (Exception $e) { return []; } }
赞一个! (2)
上一篇:PHP的多继承实现
下一篇:多进程和多线程有什么区别?