У меня есть следующий базовый сценарий, который делает основной запрос 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, но это тоже не сработало. Любая помощь, пожалуйста? Благодаря..
EDIT Я добавил set_time_limit (500);
и теперь вторая ошибка, конечно, исчезла … но первая по-прежнему остается.
Хорошо, нашел проблему. Было глупо. Проблема в том, что сервер, делающий запрос (где находится файл PHP), имеет брандмауэр, а брандмауэр разрешает только внешний порт 21, 22, 80, 3306 и 1433 для внешнего запроса.
void set_time_limit (int $ seconds)
Установите количество секунд, в течение которых сценарий можно запустить. Если это будет достигнуто, скрипт вернет фатальную ошибку. Предел по умолчанию составляет 30 секунд или, если он существует, значение max_execution_time, определенное в php.ini.
Когда вызывается, set_time_limit () перезапускает счетчик тайм-аута с нуля. Другими словами, если таймаутом является значение по умолчанию 30 секунд и 25 секунд для выполнения скрипта, выполняется вызов типа set_time_limit (20), скрипт будет работать в общей сложности за 45 секунд до истечения времени ожидания. Если установлено равным нулю, лимит времени не налагается.
Попробуй это:
'header' => implode("\r\n", array("Connection: close", "Content-type: application/x-www-form-urlencoded")),
(особенно соединение: близкий бит)
Также: можете ли вы дублировать проблему на commanline с curl?
Для CentOS использование file_get_contents()
для доступа к URL-адресу на порту, отличном от 80, не работает с разрешенным разрешением. Он работает только тогда, когда selinux установлен на «disabled» или «permissive».
Если вы не хотите отключать selinux для обеспечения безопасности, вы можете изменить политику selinux, чтобы HTTPd мог прослушивать 8282
Чтобы указать, какие порты разрешены для порта httpd: semanage -l | grep -w http_port_t
Чтобы добавить порт 8282: порт семантики -a -t http_port_t -p tcp 8282