2010-02-02 145 views
3

我的腳本使用捲曲通過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

回答

3

不知道是什麼問題...什麼是失敗時的反應如何?系統和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

1

在我們可以幫忙之前,我們可能需要更多信息,但它聽起來像是超時問題。

打開錯誤報告或檢查錯誤日誌以查看是否有任何提示。

嘗試設置長卷曲超時與CURLOPT_TIMEOUT

還要檢查你的腳本超時足夠或set_time_limit()

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設置)。

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模式運行你的腳本。最後,如果你還沒有進入安全模式,你可以嘗試使用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);