【问题标题】:PHP multi curl works on one machine, fails on anotherPHP multi curl 在一台机器上工作,在另一台机器上失败
【发布时间】:2013-09-14 22:35:33
【问题描述】:

我正在尝试使用 multi curl 运行并行图像下载。 我有一个简短的脚本,在我的笔记本电脑上运行良好(php 5.3.10-1),但在我的服务器上失败了(PHP 5.5.3-1)。

当我在服务器上运行此脚本时,正在创建目标文件(我猜 curl 成功打开了句柄)但文件为空,我在服务器上看不到任何警告或错误以指示任何问题.

我目前正在通过 CLI 对其进行测试,所以 php 的 cli 的 php.ini 有:

error_reporting = E_ALL
display_errors = On 

这是我做的第一件事。 我唯一看到的是一个警告:PHP 警告:模块 'PDO' 已经在第 0 行的未知中加载

以下是我在网上编写/找到的原始 POC 代码示例,它在我的笔记本电脑上完美运行,但在我的服务器上却失败了。 我会很感激你的想法。 感谢并抱歉没有明确调试级别。

    <?php
    $urls = array(
        'http://static.php.net/www.php.net/images/php.gif',
        'http://p.ebaystatic.com/aw/pics/globalheader/spr9.png'
    );

    $save_to = '/tmp/';

    function add_file_to_curl($save_to, $mh, $url, $i){
            global $conn, $fp;
            $g=$save_to.basename($url);
            if(is_file($g)){
                    unlink($g);
            }
            $conn[$i]=curl_init($url);
            $fp[$i]=fopen ($g, "w");
            curl_setopt ($conn[$i], CURLOPT_FILE, $fp[$i]);
            curl_setopt ($conn[$i], CURLOPT_HEADER ,0);
            curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
            curl_multi_add_handle ($mh,$conn[$i]);
    }

    $conn="";
    $fp="";
    $mh = curl_multi_init();
    foreach ($urls as $i => $url) {
            add_file_to_curl($save_to, $mh, $url, $i);
            echo "URL IS $url, I is $i\n";
    }
    do {
            $n = curl_multi_exec($mh,$running);
            $ready = curl_multi_select($mh); // Waiting for one of the files to finish
            if(0 < $ready){
                    while($info = curl_multi_info_read($mh)){
                            $status = curl_getinfo($info['handle'],CURLINFO_HTTP_CODE);
                            echo "STATUS $status\n";
                            if(200 == $status){
                                    $successUrl = curl_getinfo($info['handle'],CURLINFO_EFFECTIVE_URL);
                                    echo "$successUrl\n";
                            }
                            break 1;
                    }
            }
    }
    while (0 < $running && -1 != $ready);
    $info = curl_multi_info_read($mh);
    $status = curl_getinfo($info['handle'],CURLINFO_HTTP_CODE);
    echo "STATUS $status\n";
    if(200 == $status){
            $successUrl = curl_getinfo($info['handle'],CURLINFO_EFFECTIVE_URL);
            echo "$successUrl\n";
    }

    foreach ($urls as $i => $url) {
            echo "Running on $url and $i\n";
            curl_multi_remove_handle($mh,$conn[$i]);
            curl_close($conn[$i]);
            fclose ($fp[$i]);
    }
    curl_multi_close($mh);
    ?>

【问题讨论】:

  • 您是否启用了错误报告?是否显示任何错误?
  • 谢谢。是的,我已启用错误报告,并且显示错误也已打开。我已经相应地更新了原始帖子。

标签: php curl debian


【解决方案1】:

我的服务器上的 php 似乎有问题。 即使来自http://php.net/manual/en/function.curl-multi-exec.php 的样本对我也不起作用(它只是挂在那里,strace 表明它只是挂在 clone(child_stack=....) 我会修复它,但它与我的代码无关,所以我决定“关闭”我的案例。

我想借此机会亲自感谢这个人,尽管他不知道出了什么问题,但他还是很好地 -1 我的问题。很有帮助。

【讨论】:

  • 搞砸所有没有评论的投反对票巨魔。我的 Mac 上也有同样的问题。当它在 /user/bin/php (即 5.4.19)中运行默认 php 时,它会永远挂起,没有发现有用的错误。当我运行我的 MAMP 构建的 php(版本 5.4.17)时,它工作正常。
猜你喜欢
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
相关资源
最近更新 更多