0

現在、ソケットを使用してhttp接続を開いて書き込みを行っていますが、必ずしも応答を気にする必要はありません。pingの追跡など

これは、古いサーバーとWindows開発環境では機能しましたが、新しいubuntuサーバーでは機能しませんでした。

使用するコードは次のとおりです

        $aUrlParts = parse_url($sUrl);

        $fp = fsockopen(
            $aUrlParts['host'],
            isset($aUrlParts['port']) ? $aUrlParts['port'] : 80,
            $errno, $errstr, 30
        );

        $sHeader = "GET {$aUrlParts['path']}?{$aUrlParts["query"]} HTTP/1.1\r\n";
        $sHeader.= "Host: {$aUrlParts['host']}\r\n";
        $sHeader.= "Connection: Close\r\n\r\n";

        fwrite($fp, $sHeader);
        fclose($fp);

fwriteの後に読み取りを行うと、サーバーからすべてを機能させることができますが、これは、URLをカールさせるだけの場合と比較して、この方法で要求を行うという点を打ち負かします。

ソケットをフラッシュして非ブロッキングに設定しようとしましたが、それは機能しません!あとで読むだけでうまくいきます!

どんな助けでも大歓迎です

編集:これらの新しいサーバーはAWSベースであり、それらのソケットの実装は異なる可能性があると感じています

4

2 に答える 2

0

これが答えとして価値があるかどうかはわかりませんが、まったく同じ問題があり、それが私がここに来た方法です。私の唯一の違いは、サーバー自体に対してリクエストを実行しようとしていたことです。

私の解決策は、サーバーのアクセス管理にありました。自分のネットワーク以外のユーザーの表示をブロックしているhtaccessファイルがありましたが、問題は、サーバーが自分自身を要求することもブロックしていたことです。

したがって、サーバーのアクセス管理と関係があるのか​​もしれません。これが役立つかどうか教えてください。

于 2012-10-04T22:21:42.000 に答える
0

私たちはコンボを使ってfsockopenいましたが、それからそれが上がって、ある日動作を停止しました。fwriteまたはそれは一種の断続的でした。少し調べてテストした後、fopenラッパーを有効にしている場合は、100分の1秒に設定されたタイムアウトで関数を使用することになりましfile_get_contentsstream_context_create。タイムアウトパラメータは変動値を受け取ることができます(https://www.php.net/manual/en/context.http.php)。サイレントに失敗するように、try...catchブロックでラップしました。それは私たちの目的のために美しく機能します。必要に応じて、キャッチでログを記録することができます。

$context = stream_context_create([
    "http" => [
        "method"=>"GET",
        "timeout" => .01
        ]
    ]
);

try {
    file_get_contents($url, 0, $context);
}catch( Exception $e ){
    // Fail silently
}
于 2020-07-15T16:19:31.897 に答える