我有一个curl put请求在我的localhost上工作正常,但在实时服务器上它会抛出500错误。这是我的代码:
public static function send( $xml )
{
$xml = str_replace( "\n", "", $xml );
//Write to temporary file
$put_data = tmpfile();
fwrite( $put_data, $xml );
fseek( $put_data, 0 );
$options = array(
CURLOPT_URL => 'http://*****************/cgi-bin/commctrl.pl?SessionId=' . Xml_helper::generate_session_id() . '&SystemId=live',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HTTPHEADER => array( 'Content-type: text/xml' ),
CURLOPT_PUT => TRUE,
CURLOPT_INFILE => $put_data,
CURLOPT_INFILESIZE => strlen( $xml )
);
$curl = curl_init();
curl_setopt_array( $curl, $options );
$result = curl_exec( $curl );
curl_close( $curl );
return $result;
}
我确实在服务器上启用了curl!
有没有人有任何想法为什么它不在服务器上工作?如果有帮助,我会在共享主机上。
我还在文件顶部启用了错误报告,但在curl完成后没有显示错误。我只是得到了通用的500错误页面。
由于
更新:
我一直与客户联系,他们已经确认发送的信息由他们接收并插入他们的后台系统。所以它必须与原因的响应有关。它是一个小块的xml,假设要返回。
另一个更新
我在不同的服务器和heroku上尝试过相同的脚本,但我仍然得到相同的结果。
另一个更新
我想我可能找到了问题的路线。由于FastCGI超时并且因为我在共享主机上而无法更改脚本,因此脚本似乎超时。任何人都可以证实这一点吗?
最终更新
我与我的托管服务提供商联系,他们确认脚本超时是由于服务器上的超时值而不是我可以使用任何PHP函数或ini_set()访问的。
答案 0 :(得分:6)
如果错误是,就像您认为的那样,与脚本超时有关,并且您无权访问php.ini文件 - 可以轻松修复
只需使用set_time_limit(INT)
,其中INT是秒数,在脚本开头覆盖php.ini文件中的设置
设置set_time_limit(128)
的超时应解决您的所有问题,并且通常被视为合理的上限
可在此处找到更多信息http://php.net/manual/en/function.set-time-limit.php
答案 1 :(得分:3)
以下是一些尝试:
删除脚本中的可变性 - 用于测试,硬编码会话ID,以使卷曲卷曲相同。如果每次运行它都会发生变化,则无法可靠地测试某些内容。
尝试直接从命令行使用curl,类似curl http://*****************/cgi-bin/commctrl.pl?SessionId=12345&SystemId=live
。这将告诉您问题是否真的是由计算机本身引起的,或者与PHP有关。
检查服务器上的日志,可能是/var/log/apache/error.log,具体取决于您的服务器使用的操作系统。另请查看访问日志,以便了解您是否实际收到相同的请求。
最后,如果你真的没有想法,你可以使用像wireshark或tcpdump / WinDump这样的程序来监控连接,这样你就可以比较从每台计算机发送的数据包。这将让您了解它们是如何不同的 - 它们是否被防火墙破坏了?是php为其中一个添加额外的标题?是否有不同的CURL默认值导致包含不同的数据?
答案 2 :(得分:1)
我怀疑你的服务器不支持tmpfile()。只是为了验证:
public static function send( $xml ) {
$xml = str_replace( "\n", "", $xml );
//Write to temporary file
$put_data = tmpfile();
if (!$put_data) die('tmpfile failed');
...
如果您在GoDaddy服务器上,请检查此... https://stackoverflow.com/questions/9957397/tmpfile-returns-false-on-godaddy-server
答案 3 :(得分:0)
哪个服务器实际显示500?从你的代码看来它似乎是本地服务器而不是远程服务器。 变化
public static function send( $xml )
{
到
public static function send( $xml )
{
error_reporting(E_ALL);
if(!function_exists('curl_exec')) {
var_dump("NO CURL");
return false;
}
有效吗?
答案 4 :(得分:0)
这几乎肯定不是php超时设置。 如果您正在使用FastCGI,那么您需要编辑此文件:
/etc/httpd/conf.d/fcgid.conf
并改变:
FcgidIOTimeout 3600
然后做:
service httpd restart
这让我疯狂了3天。最高投票的答案是错误的!