2012-09-21 203 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