PHP多线程

发布时间2022-12-29 21:15:28PHP11人已围观

简介 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)

文章评论