2011-12-28 3 views
2

Le serveur A utilise fsockopen, fwrite et fgets pour collecter des informations du serveur distant B. Le serveur distant B crée des requêtes mysql et fournit cette information. Lors du premier chargement du serveur A, toutes les informations (du serveur distant B) apparaissent sur le serveur A, ce qui signifie que la connexion fonctionne correctement. Cependant, parfois, lorsque la page est actualisée (sur le serveur A), aucune information sur le serveur distant B n'est affichée. Pourquoi est-ce?fsockopen n'effectue pas toujours les requêtes mysql lorsque la page est rafraîchie

le code sur le serveur A est assez simple:

function test_http_request($path, $host, $test_request, $port=80){ 
    $test_request_proc= test_encode($test_request); 
    //http request 
    $http_request = "POST $path HTTP/1.0\r\n"; 
    $http_request .= "Host: $host\r\n"; 
    $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n"; 
    $http_request .= "Content-Length: " . strlen($test_request_proc) . "\r\n"; 
    $http_request .= "User-Agent: testConnection/PHP\r\n"; 
    $http_request .= "\r\n"; 
    $http_request .= $test_request_proc; 
    /////output 
    $test_resource = ''; 
    //open socket 
    if(false == ($test_connect [email protected]('[remote server Bs IP ]', $port, $errno, $errstr, 10))){die('could not open test connection');} 
    //send http_request 
    fwrite($test_connect, $http_request); 
    //get response 
    while(!feof($test_connect))$test_resource .= fgets($test_connect, 1160); 
    //close socket 
    fclose($test_connect); 

    $test_resource = explode("\r\n\r\n", $test_resource, 2); 
    return $test_resource; 
} 

Selon l'erreur de serveur distant B enregistre les requêtes MySQL (qui sont effectuées pour fournir les informations au serveur A) ne sont pas en cours d'exécution (la ressource est booléen). Parfois, ils sont effectués et parfois ils ne sont pas effectués. Le problème ne se trouve pas dans le langage de requête car il fonctionne parfaitement lorsque la requête est demandée et exécutée sur le serveur distant B. Ce n'est que lorsque le serveur A demande l'information via fsockopen() que le problème apparaît. note: le problème réside uniquement dans les requêtes mysql effectuées par le serveur distant B, tout texte sorti avant main apparaît à chaque fois. Merci pour votre temps

+0

Je pense que vous avez besoin de poster quelques exemples de srv A et B. – ethrbunny

Répondre

0

Si vous avez deux sockets parlant les uns avec les autres comme vous avez - avec un "while (true)" - et vous redémarrez l'un d'entre eux, l'autre essaie toujours de communiquer avec la première instance . Vous devez rechercher une indication que le serveur (redémarré) s'est déconnecté et rouvrir la connexion. Essentiellement, un côté de la conversation a raccroché mais l'autre côté écoute toujours ... rien.

+0

cela sonne bien. Je suis encore nouveau à ce sujet. Comment suggérez-vous que j'y aille? – YWSW

+0

Je ne suis pas familier avec 'fsockopen', 'fgets', etc mais je parierais qu'il y a un signal qu'un côté de la conversation a fermé. Aussi - (juste jeté un coup d'oeil) - la fonction 'fgets' utilise le second param comme une longueur. Vous bloquez jusqu'à ce que vous obteniez toutes les valeurs. Essayez une valeur plus petite (ou 1) et construisez la réponse vous-même. Cela vous permettra de savoir si la connexion est fermée. – ethrbunny

+0

ne semble pas fonctionner – YWSW

Questions connexes