file_get_contents在端口8282上不起作用

时间:2012-08-21 16:48:11

标签: php post file-get-contents

我得到了以下基本脚本,他们发出了一个基本的POST请求(我只想在我添加更多内容之后使其工作):

#   Variables
$URL = 'http://******:8282/api/incoming_shipment/';

$postdata = http_build_query(
    array(
        'contract_id'       => 'Showcare-R124276',
        'shipment_from'     => 'Montréal',
        'shipment_to'       => 'Chicago',
        'shipping_time'     => '2012-08-16 14:51:01',
        'tracking_cie'      => 'Poste Canada',
        'tracking_type'     => 'Standard',
        'tracking_number'   => 'EP645 9834 123 9773'
    )
);

$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context = stream_context_create($opts);

$result = file_get_contents($URL, FALSE, $context);

print_r($result);

结果告诉我:

Warning: file_get_contents(http://******:8282/api/incoming_shipment/) [function.file-get-contents]: failed to open stream: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. in D:\Inetpub\hightechhandling\api\api_push_contract.php on line 31

Fatal error: Maximum execution time of 30 seconds exceeded in D:\Inetpub\hightechhandling\api\api_push_contract.php on line 31

但是当我使用浏览器访问网页时,它可以完美运行。我尝试过cURL和fsocketopen,但这也没有用。有什么帮助吗?感谢..

编辑我添加了set_time_limit (500);,现在第二个错误已经消失了......但第一个仍然存在。

5 个答案:

答案 0 :(得分:1)

好的,发现了问题。太愚蠢了。问题是因为发出请求的服务器(PHP文件所在的位置)启用了防火墙,防火墙只允许端口21,22,80,3306和1433用于外部请求。

答案 1 :(得分:1)

对于CentOS,使用file_get_contents()访问80以外的端口上的URL不适用于拒绝权限。仅当selinux设置为“禁用”或“允许”时才有效。

答案 2 :(得分:0)

来自PHP手册

  

void set_time_limit(int $ seconds)

     

设置允许脚本运行的秒数。如果是这样的话   到达后,脚本返回致命错误。默认限制为30   秒,或者,如果存在,则定义的max_execution_time值   php.ini中。

     

调用时,set_time_limit()从零重新启动超时计数器。   换句话说,如果超时是默认的30秒,那么25   在脚本执行的几秒钟内,调用如set_time_limit(20)   制作完成后,脚本将在超时前运行45秒。   如果设置为零,则不会施加时间限制。

答案 3 :(得分:0)

试试这个:

'header' => implode("\r\n", array("Connection: close", "Content-type: application/x-www-form-urlencoded")),

(尤其是连接:关闭位)

另外:你能用curl复制commanline上的问题吗?

答案 4 :(得分:0)

如果您不想出于安全考虑而禁用selinux,则可以修改selinux策略以允许httpd监听8282

列出httpd允许的端口: semanage port -l | grep -w http_port_t

添加端口8282: semanage port -a -t http_port_t -p tcp 8282