PHP curl положил 500 ошибок

У меня есть запрос на завивки, который отлично работает на моем локальном хосте, но на реальном сервере он возвращает 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; } 

У меня есть завиток включен на сервере!

У кого-нибудь есть идеи, почему он не работает на сервере? Я нахожусь на общем хостинге, если это помогает.

Я также включил отчет об ошибках в верхней части файла, но после завершения завитки ошибки не появляются. Я просто получаю общую страницу ошибок 500.

благодаря

ОБНОВИТЬ:

Я был в контакте с клиентом, и они подтвердили, что полученная информация получена и вставлена ​​в их бэк-офисную систему. Поэтому это должно быть связано с ответом, который является причиной. Это небольшой блок xml, который, как предполагается, должен быть возвращен.

ДРУГОЕ ОБНОВЛЕНИЕ

Я пробовал один и тот же скрипт на другом сервере и герою, и я все равно получаю тот же результат.

ДРУГОЕ ОБНОВЛЕНИЕ

Кажется, я нашел путь к проблеме. Сценарий, похоже, отключается из-за тайм-аута FastCGI, и поскольку я нахожусь на совместном хостинге, я не могу его изменить. Может ли кто-нибудь подтвердить это?

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ

Я связался с моим хостинг-провайдером, и они подтвердили, что сценарий был отключен из-за значения тайм-аута на сервере, а не того, с которым я могу получить доступ с любой функцией PHP или ini_set ().

Если ошибка, как вы думаете, связана с таймаутом сценария, и у вас нет доступа к файлу php.ini – есть легкое исправление

просто используйте set_time_limit(INT) где INT – это количество секунд, в начале вашего скрипта, чтобы переопределить параметры в файле php.ini

Установка таймаута set_time_limit(128) должна решить все ваши проблемы и обычно принимается как разумный верхний предел

Более подробную информацию можно найти здесь http://php.net/manual/en/function.set-time-limit.php

Вот несколько вещей, которые нужно попробовать:

  1. Удалите изменчивость в скрипте – для тестирования, hardcode идентификатор сеанса, так что завиток скручивания тот же. Вы не можете надежно проверить что-то, если оно меняется каждый раз, когда вы его запускаете.

  2. Попробуйте использовать curl прямо из командной строки, используя что-то вроде curl http://*****************/cgi-bin/commctrl.pl?SessionId=12345&SystemId=live . Это покажет вам, действительно ли проблема связана с самим компьютером или чем-то связана с PHP.

  3. Проверьте журналы на своем сервере, возможно, что-то вроде /var/log/apache/error.log в зависимости от того, какую ОС использует ваш сервер. Также просмотрите журнал доступа, чтобы вы могли видеть, действительно ли вы получаете тот же запрос.

  4. Наконец, если у вас действительно закончились идеи, вы можете использовать такую ​​программу, как wireshark или tcpdump / WinDump, для контроля соединения, чтобы вы могли сравнивать пакеты, отправляемые с каждого компьютера. Это даст вам представление о том, как они отличаются друг от друга – они искажены брандмауэром? Является ли php добавлением дополнительных заголовков в один из них? Различаются ли значения CURL по умолчанию для разных данных?

Я подозреваю, что ваш сервер не поддерживает 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

Какой сервер на самом деле показывает 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; } 

это работает ?

Это почти наверняка не параметр тайм-аута php. Если вы используете FastCGI, как вы заявили, вам необходимо отредактировать этот файл:

/etc/httpd/conf.d/fcgid.conf

И измените:

 FcgidIOTimeout 3600 

Затем выполните:

 service httpd restart 

Это заставило меня с ума сойти на 3 дня. Высший проголосовавший ответ на это неверен!