PHP使用fsockopen函数实现伪异步

WEB服务器端开发异步场景非常之多,比如说异步发送短信、邮件、处理根式各样的耗时任务等等,但PHP语言先天不足无法多线程。本篇文章徐叔主要介绍使用fsockopen函数来实现伪异步。

贴代码

/**
 * 异步POST请求
 * @param $url url地址
 * @param array $params 参数
 */
function async_post($url, $params = [])
{
    $url_arr = parse_url($url);
    $host = $url_arr['host'];
    $port = isset($url_arr['port']) ? $url_arr['port'] : 80;
    $path = $url_arr['path'];
    $query = isset($params) ? http_build_query($params) : '';
    $errno = 0;
    $errstr = '';
    $timeout = 60;
    $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);
}

使用案例

public function index()
    {

        $domains = [
            'zooo.cc',
            'dowerly.com',
            'razzleton.com',
            'd-dollar.cc',
            'pokeradv.com',
            'cryptostrategy.biz',
            'in-delhi.in',
            'hourdeposit.com',
            'asset-finance.com',
            'earntech.cc',
            'nvestyoutime.com',
            'safeumoney.com',
            'instaadpays.com',
            'profitbank.org',
            'cool-deposit.com',
            'cloudminingpool.com',
            'rmc-bank.com',
            'rubix-cube.cc',
            'bitpayingads.com',
            '3daypayout.net',
            'trustbitdeposit.com',
            'payhour.biz',
            'bitwallet.biz',
            'perfectbtc.com',
            'forexparadise.biz',
            'depositclub.biz',
            'coininvest.biz',
            'earndollar.biz',
            'rmc-bank.com',
            'us-income.com',
            'fxtrade.io',
            'bitz2u.com',
            'allerainvest.com',
            'cool-deposit.com',
            'hourfxprofit.co',
            'astoriaforex.com',
            'bluechiplab.com',
            'gradlux.com'
        ];

        $url = url('/admin/test/task',null,null,true);

        foreach ($domains as $domain){
            echo "爬取" . $domain. "监控图片...<br>";
            async_post($url,['domain' => $domain]);
        }

    }