2012-09-21 201 views
0

我使用php shell_exec從jQuery運行命令,但它保持超時。500(內部服務器錯誤)php shell_exec

所以我的jQuery如下。

var send = { 
    url: $(this).data('url') 
} 

$.ajax({ 
    type: "POST", 
    url: "<?php echo base_url(); ?>index.php/upload", 
    data: send, 
    //dataType: "json", 
    //timeout: 8000, 
    beforeSend: function() { 

    }, 
    success: function(response) { 
     console.log(response); 
    }, 
    error: function() { 
     alert('error'); 
    } 
}); 

這就要求它運行了shell_exec函數

function upload(){ 
    $output = shell_exec("wget {$_POST['url']} 2>&1");  
    echo "<pre>" . $output . "</pre>"; 
} 

確定這是否是貼wget的獲取URL拉着一個小文件,工作正常,但如果wget獲取文件說超過20MB我得到500(內部服務器錯誤)

我已經檢查過的東西到目前爲止 所有我的php設置文件上傳限制最大文件大小等內存限制所有我已設置爲最大。

我沒有得到的東西在當地工作正常,但在我的主機上我得到這個錯誤,我已經聯繫我的主機媒體寺廟,他們說已經超出了他們的支持範圍。

有關如何進一步調試的任何建議?

+1

我會在['set_time_limit(0);'](http://php.net/set-time-limit)上修正它100英鎊。 (把它作爲PHP'upload()'函數的第一行) – DaveRandom

+1

也要注意你正在做的事情有巨大的安全隱患。 – DaveRandom

+0

@DaveRandom @DaveRandom我想看看你的賭注如何... – Baba

回答

0

發生什麼事是某種反向代理 - 例如Apache平衡器 - 超時,無論PHP腳本是否超時。您可以通過創建一個腳本進行驗證,如

<?php sleep(60); ?> 

並試驗不同的延遲。

無論如何,只要出現是一個解決方案,因爲有些瀏覽器(例如IE8 +)無論如何都會超時。

通常這是通過分離wget進程並在進程狀態上進行PHP頁面檢查來解決的,例如刷新時間爲5..30秒。但是許多提供商對於分離流程持否定態度,因爲這可能會使系統服務數十個網站(=付費客戶!)的內存耗盡。因此,您必須與提供商檢查解決方案是否可以接受。

如果是,可以查看「Asynchronous shell exec in PHP」。

+0

嗨Islerni感謝您的回覆,我在專用服務器上,所以我不應該只從自己的內存中盜取內存正確我如果我錯了。生病嘗試你上面的方法併發回。 – user1503606

+0

好大的縮小它我試過睡10 20 30 40 50所有返回true,但只要我去睡覺(60)我得到了服務器500內部錯誤... – user1503606

+0

您可以通過將PHP超時設置爲5秒來進一步縮小檢查範圍,然後運行「睡眠(10)」(或更好的睡眠10的shell_exec,因爲我不確定PHP睡眠是否計爲執行時間) 。這將導致「真正的」PHP超時,以及一個致命的錯誤,但不是「500內部服務器錯誤」。如果是這樣,那麼你需要進一步挖掘;但如果沒有,並且您獲得了像http://drupal.org/files/issues/ScreenShot003_0.png這樣的頁面,那麼您可以確定它不是PHP問題,您可以返回提供商問作出解釋。 – LSerni