像php中的线程一样

时间:2011-09-23 11:22:11

标签: php sockets curl

我正在尝试编写yahoo messenger机器人,现在我的机器人可以获取消息并回答它们。 雅虎每次收到通知时都只能发送100点。

现在我想回答每一个下午。我使用while(true){ }来回答第一个下午,然后是第二个,然后是第三个...... 它太慢了,因为我只能通过这个与雅虎建立一个连接(我使用curlib)。 我怎样才能同时发送一些消息呢?我想我需要像线程一样的东西但是在PHP中。

2 个答案:

答案 0 :(得分:3)

你可以使用pcntl_fork()。 http://www.php.net/manual/en/function.pcntl-fork.php

你需要pcntl扩展,它只适用于Unix

如果使用curl函数,可以查看curl_multi_init()。 http://www.php.net/manual/en/function.curl-multi-init.php

答案 1 :(得分:0)

我在下面写了一个简单的函数,其中启动了网址,而不是等待结果,所以这样你可以在自己的网站上启动很多网址,它会让你的循环快速,也无需在服务器上安装任何扩展程序。

function call_url_async($url, $params, $type='POST', $timeout_in_seconds = 1)
{
    //call the URL and don't wait for the result - useful to do time-consuming tasks in background
    foreach ($params as $key => &$val) 
    {
        if (is_array($val)) 
            $val = implode(',', $val);
        $post_params[] = $key.'='.urlencode($val);
    }
    $post_string = implode('&', $post_params);

    $parts=parse_url($url);

    $fp = fsockopen($parts['host'], isset($parts['port'])?$parts['port']:80, $errno, $errstr, $timeout_in_seconds);
    //if ($fp == FALSE)
    //  echo "Couldn't open a socket to ".$url." (".$errstr.")<br><br>";

    // Data goes in the path for a GET request
    if ('GET' == $type) 
        $parts['path'] .= '?'.$post_string;

    $out = "$type ".$parts['path']." HTTP/1.1\r\n";
    $out.= "Host: ".$parts['host']."\r\n";
    $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
    $out.= "Content-Length: ".strlen($post_string)."\r\n";
    $out.= "Connection: Close\r\n\r\n";
    // Data goes in the request body for a POST request
    if ('POST' == $type && isset($post_string)) 
        $out.= $post_string;

    fwrite($fp, $out);
    fclose($fp);
}