3

我的脚本使用 curl 通过smugsmug api将图像上传到smugsmug站点。我遍历一个文件夹并上传其中的每张图片。但在 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);
4

5 回答 5

3

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

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

于 2010-02-02T17:03:34.880 回答
1

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

打开错误报告或检查您的错误日志以查看是否有任何问题。

尝试设置长卷曲超时CURLOPT_TIMEOUT

还要检查您的脚本超时是否足够或增加set_time_limit()

于 2010-02-02T17:18:25.953 回答
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/

于 2010-02-11T08:42:24.633 回答
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设置)。

于 2010-02-06T19:59:24.830 回答
0

1-强制卷曲告诉你更多关于它的作用

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);
于 2010-02-11T13:52:56.600 回答