curl暂停脚本执行

问题描述:

我的脚本使用卷曲通过smugsmug api将图像上传到smugsmug站点。 我通过一个文件夹循环并上传每个图像。但是在3-4次上传之后,curl_exec会失败,停止一切并阻止其他图像上传。curl暂停脚本执行

$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); 
+2

是否引发了任何错误?也许你的脚本超出了时间限制。 – 2010-02-02 17:03:11

+3

您是否有错误报告和错误显示或记录打开?你有没有使用curl_getinfo()和curl_errmsg()? – GZipp 2010-02-02 17:25:22

不知道是什么问题...什么是失败时的反应如何?系统和apache日志说什么?

现在,如果我是你,我不会在循环中使用curl_init()curl_close()。相反,我会在循环之前初始化,然后在循环之后关闭 - 然后在循环内使用来设置url和不同参数,并且只需拨打curl_exec()即可。它甚至可能是所有这些处理超出某种系统限制的事情。如果您需要/想要使用多个连接,您可以使用curl_multi或编写一些管理功能/类来管理多个句柄。

+0

我没有访问Apache日志。它刚刚停止。 – 2010-02-02 17:06:29

+1

@prodigitalson - 我想你的意思是说“...我不会在循环中使用curl_init()和curl_close()。” – GZipp 2010-02-02 17:24:41

+0

@GZipp:是的。纠正。 – prodigitalson 2010-02-02 17:26:19

在我们可以帮忙之前,我们可能需要更多信息,但它听起来像是超时问题。

打开错误报告或检查错误日志以查看是否有任何提示。

尝试设置长卷曲超时与CURLOPT_TIMEOUT

还要检查你的脚本超时足够或set_time_limit()

增加你可以尝试是否输出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设置)。

当一个人处理多个高延迟请求(例如上传图像)时,CURL包含'multi'(用于多种资源)选项。

参见: 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/

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模式运行你的脚本。最后,如果你还没有进入安全模式,你可以尝试使用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);