PHP curl mis d'erreur 500

j'ai une requête curl put qui fonctionne très bien sur mon serveur local mais sur le serveur live elle renvoie une erreur de 500. Voici mon code:

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;
    }

j'ai curl activé sur le serveur!

quelqu'un a une idée pourquoi il ne fonctionne pas sur le serveur? Je suis sur l'hébergement partagé si ça peut aider.

j'ai aussi activé les rapports d'erreur en haut du fichier, mais pas d'erreurs spectacle après la boucle est terminée. Je viens d'obtenir la page d'erreur generic 500.

Merci

mise à jour:

j'ai été en contact avec le client et ils ont confirmé que l'information qui est envoyée est reçue par eux et insérée dans leur système d'arrière-guichet. Cela doit donc être lié à la réponse qui en est la cause. C'est un petit bloc de code xml qui est supposé être retourné.

UNE AUTRE MISE À JOUR

j'ai essayé le même script sur un serveur différent et heroku et j'obtiens toujours le même résultat.

UNE AUTRE MISE À JOUR

je pense que j'ai peut-être trouvé la route du problème. Le script semble se synchroniser à cause d'un timeout sur FastCGI et parce que je suis sur un hébergement partagé, Je ne peux pas le changer. Quelqu'un peut-il confirmer cela?

MISE À JOUR FINALE

j'ai pris contact avec mon hébergeur et ils ont confirmé que le script était en raison de la valeur de délai d'expiration sur le serveur et non pas celui que je peux y accéder avec n'importe quel fonction PHP ou la fonction ini_set().

4
demandé sur David Jones 2013-11-18 20:52:37

5 réponses

si l'erreur est, comme vous le pensez, liée à un script timeout et que vous n'avez pas accès au php.fichier ini - il y a une solution facile

utilisez simplement set_time_limit(INT) où INT est le nombre de secondes, au début de votre script pour outrepasser les paramètres dans le php.fichier ini

fixer un délai de set_time_limit(128) devrait résoudre tous vos problèmes et est généralement accepté comme une limite supérieure raisonnable

plus info peut être trouvé ici http://php.net/manual/en/function.set-time-limit.php

6
répondu Dan Green-Leipciger 2013-12-09 15:15:43

Voici quelques choses à essayer:

  1. supprimez la variabilité dans le script - pour tester, codez l'id de session, de sorte que la boucle est la même. Vous ne pouvez pas tester de manière fiable quelque chose, si elle change à chaque fois que vous l'exécutez.

  2. essayez d'utiliser curl directement depuis la ligne de commande, via quelque chose comme curl http://*****************/cgi-bin/commctrl.pl?SessionId=12345&SystemId=live . Cela vous montrera si le problème est vraiment dû à l'ordinateur lui-même, ou quelque chose de le faire avec PHP.

  3. vérifiez les logs sur votre serveur, probablement quelque chose comme /var/log/apache/error.journal selon le système d'exploitation de votre serveur utilise. Regardez aussi le journal des accès, pour voir si vous recevez la même requête.

  4. enfin, si vous êtes à court d'idées, vous pouvez utiliser un programme comme wireshark ou tcpdump/WinDump pour surveiller la connexion, donc que vous pouvez comparer les paquets envoyés par chaque ordinateur. Cela vous donnera une idée de la façon dont ils sont différents - sont-ils déformés par un pare-feu? Est php en ajoutant des en-têtes supplémentaires à l'un d'eux? Est-ce que différentes valeurs par défaut de CURL provoquent l'inclusion de différentes données?

3
répondu Benubird 2013-12-05 10:51:20

je soupçonne que votre serveur ne supporte pas tmpfile(). Juste pour vérifier:

public static function send( $xml ) {
$xml = str_replace( "\n", "", $xml );

//Write to temporary file
$put_data = tmpfile();
if (!$put_data) die('tmpfile failed');
...

si vous êtes sur GoDaddy server, vérifiez ceci... https://stackoverflow.com/questions/9957397/tmpfile-returns-false-on-godaddy-server

1
répondu Amit Kriplani 2017-05-23 11:59:37

quel serveur affiche les 500 ? à partir de votre code, il semble que le serveur local plutôt que la télécommande. changement

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;
     }

ça marche ?

0
répondu exussum 2013-12-05 11:31:34

ce n'est certainement pas le paramètre php timeout. Si vous utilisez FastCGI comme vous l'avez indiqué, vous devez éditer ce fichier:

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

et changement:

FcgidIOTimeout 3600

Alors:

service httpd restart

ça m'a rendu fou pendant 3 jours. La réponse la plus votée est fausse!

0
répondu wbinky 2014-01-05 07:54:07