curl暂停脚本执行

时间:2010-02-02 16:59:08

标签: php curl curl-multi

我的脚本使用curl通过smugsmug将图片上传到smugsmug api网站。 我循环浏览文件夹并上传其中的每个图像。但是3-4次上传后,curl_exec会失败,停止所有内容并阻止其他图片上传。

$upload_array = array(
    "method" => "smugmug.images.upload",
    "SessionID" => $session_id,
    "AlbumID" => $alb_id,
    "FileName" => zerofill($n, 3) . ".jpg",
    "Data" => base64_encode($data),
    "ByteCount" => strlen($data),
    "MD5Sum" => $data_md5);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $upload_array);
curl_setopt(
    $ch, CURLOPT_URL, 
    "https://upload.smugmug.com/services/api/rest/1.2.2/");
$upload_result = curl_exec($ch); //fails here
curl_close($ch);

更新: 所以我添加了登录到我的脚本。当它失败时,记录在 fwrite($ fh,“begin curl \ n”)之后停止;

fwrite($fh, "begin curl\n");
$upload_result = curl_exec($ch);
fwrite($fh, "curl executed\n");
fwrite($fh, "curl info: ".print_r(curl_getinfo($ch,true))."\n");
fwrite($fh, "xml dump: $upload_result \n");
fwrite($fh, "curl error: ".curl_error($ch)."\n");

我也

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60*60);

5 个答案:

答案 0 :(得分:3)

不确定问题是什么...什么在响应失败时?系统和apache日志说什么?

如果我是你,我不会在循环中使用curl_init()curl_close()。相反,我会在循环之前初始化,然后在循环之后关闭 - 然后在循环之内itsef我会使用curl_set_opt设置网址和不同的参数,只需调用curl_exec()。甚至可能是所有这些句柄超出某种系统限制或其他问题。如果您需要/想要使用多个连接,可以使用curl_multi或编写一些管理函数/类来管理多个句柄。

答案 1 :(得分:1)

在我们提供帮助之前,我们可能需要更多信息,但听起来可能是超时问题。

启用错误报告或检查错误日志以查看是否有任何问题。

尝试使用CURLOPT_TIMEOUT

设置长cURL超时

同时检查脚本超时是否足够,或者使用set_time_limit()

增加

答案 2 :(得分:0)

您可以尝试直接输出curl_error()

$upload_result = curl_exec($ch); //fails here

$error = curl_error($ch();    
if ($error) echo "CURL Error: $error";

curl_close($ch);

如果这样做无效,请检查您的phpinfo();以查看是否全局关闭错误报告(查找display_errors设置)。

答案 3 :(得分:0)

CURL包含“多个”(针对多个资源)选项,用于处理多个高延迟请求(例如上传图像)。

请参阅: http://www.php.net/manual/en/function.curl-multi-exec.php 以及这里描述的整个“多”功能库: http://php.net/manual/en/book.curl.php

有关库的多资源部分的完整示例,请参阅: http://www.developertutorials.com/blog/php/parallel-web-scraping-in-php-curl-multi-functions-375/

答案 4 :(得分:0)

1- Force Curl告诉你更多关于它的作用

curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HEADER, true);

2-如果您未处于安全模式,请确保PHP将错误放在脚本的开头显示错误:

<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);

3-您也可以尝试以CLI模式运行脚本。

4-最后,如果你不处于安全模式,你可以尝试使用exec()直接运行curl二进制文件。

<?php

$curl_str = "curl -k -o /my/path/curl_output.log -d 'var1=".$value1."&var2=".$value2."& etc...' https://upload.smugmug.com/services/api/rest/1.2.2/";
$r = exec($curl_str);