1

基本的な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

しかし、ブラウザでWebページにアクセスすると、完全に機能します。cURLとfsocketopenを試しましたが、うまくいきませんでした。何か助けてください?ありがとう..

編集私が追加set_time_limit (500);しましたが、2番目のエラーはもちろん消えました...しかし最初のエラーはまだ残っています。

4

5 に答える 5

1

わかりました、問題を見つけました。すっごくバカだった。問題は、リクエストを行うサーバー(PHPファイルがある場所)でファイアウォールが有効になっていて、ファイアウォールが外部リクエストに対してポート21、22、80、3306、および1433のみを許可しているためです。

于 2012-08-21T18:13:33.200 に答える
1

CentOSfile_get_contents()の場合、80以外のポートでURLにアクセスするために使用することは、許可が拒否された場合には機能しません。selinuxが「disabled」または「permissive」に設定されている場合にのみ機能します。

于 2013-07-19T04:30:44.303 に答える
0

PHPマニュアルから

void set_time_limit(int $ seconds)

スクリプトの実行を許可する秒数を設定します。これに達すると、スクリプトは致命的なエラーを返します。デフォルトの制限は30秒です。存在する場合は、php.iniで定義されているmax_execution_time値です。

set_time_limit()が呼び出されると、タイムアウトカウンターがゼロから再開されます。つまり、タイムアウトがデフォルトの30秒で、スクリプト実行の25秒後にset_time_limit(20)などの呼び出しが行われる場合、スクリプトはタイムアウトする前に合計45秒間実行されます。ゼロに設定すると、時間制限は課されません。

于 2012-08-21T16:57:06.433 に答える
0

これを試して:

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

(特に接続:クローズビット)

また:curlを使用してcommanlineに問題を複製できますか?

于 2012-08-21T17:28:46.577 に答える
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

于 2013-07-19T05:10:05.487 に答える