У меня есть запрос на завивки, который отлично работает на моем локальном хосте, но на реальном сервере он возвращает 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
Вот несколько вещей, которые нужно попробовать:
Удалите изменчивость в скрипте – для тестирования, hardcode идентификатор сеанса, так что завиток скручивания тот же. Вы не можете надежно проверить что-то, если оно меняется каждый раз, когда вы его запускаете.
Попробуйте использовать curl прямо из командной строки, используя что-то вроде curl http://*****************/cgi-bin/commctrl.pl?SessionId=12345&SystemId=live
. Это покажет вам, действительно ли проблема связана с самим компьютером или чем-то связана с PHP.
Проверьте журналы на своем сервере, возможно, что-то вроде /var/log/apache/error.log в зависимости от того, какую ОС использует ваш сервер. Также просмотрите журнал доступа, чтобы вы могли видеть, действительно ли вы получаете тот же запрос.
Наконец, если у вас действительно закончились идеи, вы можете использовать такую программу, как 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 дня. Высший проголосовавший ответ на это неверен!