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.

Спасибо

UPDATE:

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

  • Измените изменчивость в script - для тестирования, hardcode - идентификатор сеанса, так что завиток будет одним и тем же. Вы не можете надежно проверить что-то, если оно изменяется при каждом его запуске.

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

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

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

Ответ 3

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

Ответ 4

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

Это работает?

Ответ 5

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

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

И измените:

FcgidIOTimeout 3600

Тогда do:

service httpd restart

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