PHPで非同期GETリクエストを行うにはどうすればよいですか?


97

別のサーバー上の別のスクリプトに対して単純なGETリクエストを作成したいと思います。どうすればよいですか?

1つのケースでは、出力を必要とせずに外部スクリプトを要求するだけです。

make_request('http://www.externalsite.com/script1.php?variable=45'); //example usage

2番目のケースでは、テキスト出力を取得する必要があります。

$output = make_request('http://www.externalsite.com/script2.php?variable=45');
echo $output; //string output

正直なところ、これはCURLの仕事ではないので、CURLをいじりたくありません。また、PECL拡張機能がないため、http_getを使用したくありません。

fsockopenは機能しますか?もしそうなら、どうすればファイルの内容を読み込まずにこれを行うことができますか?他に方法はありませんか?

皆さんありがとう

更新

最初のケースでは、スクリプトが何かを返すのを待ちたくありません。私が理解しているように、file_get_contents()はページが完全に読み込まれるのを待ちますか?


6
@William:はい、ほとんどの質問は自分自身の正確な複製と見なすことができます。8-)間違ったリンクを投稿したと思います...
RichieHindle


1
musicfreakが投稿したリンクを投稿するつもりでしたが、タブを混ぜました;-)
William Brendel

2
@Richie:ほとんどの質問?;)
サーシャチェディゴフ2009年

1
リクエストに応答を使用することを気にしないようにしたいので、他と区別するために質問のタイトルを変更しました(スクリプトの残りの部分が実行されるときに発生する可能性があるため)。間違えたら元に戻してください!
2009年

回答:


52

file_get_contents あなたがしたいことをします

$output = file_get_contents('http://www.example.com/');
echo $output;

編集:GETリクエストを開始してすぐに戻る方法の1つ。

http://petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.htmlから引用

function curl_post_async($url, $params)
{
    foreach ($params as $key => &$val) {
      if (is_array($val)) $val = implode(',', $val);
        $post_params[] = $key.'='.urlencode($val);
    }
    $post_string = implode('&', $post_params);

    $parts=parse_url($url);

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

    $out = "POST ".$parts['path']." HTTP/1.1\r\n";
    $out.= "Host: ".$parts['host']."\r\n";
    $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
    $out.= "Content-Length: ".strlen($post_string)."\r\n";
    $out.= "Connection: Close\r\n\r\n";
    if (isset($post_string)) $out.= $post_string;

    fwrite($fp, $out);
    fclose($fp);
}

これにより、ソケットが開き、get要求が発行され、すぐにソケットが閉じて戻ります。


6
curl_post_asyncは、GETではなくPOSTリクエストを送信します。
Vinko Vrsalovic 2009年

13
この関数の名前が不適切であると言ってもいいでしょうか。実際には、curlライブラリとは何の関係もありません。fsock_post_async()に似ています
MikeMurko

61
これは非同期ではありません!特に、反対側のサーバーがダウンしている場合、このコードは30秒間ハングします(fsockopenの5番目のパラメーター)。また、fwriteは実行に甘い時間を費やします(stream_set_timeout($ fp、$ my_timeoutで制限できます)。最善の方法は、fsockopenのタイムアウトを0.1(100ms)に設定し、$ my_timeoutを100msに設定することです。 。あなたは、しかし、その要求のタイムアウトを危険にさらす。
クリス・チネリ

4
これは非同期とは関係ありません。これはできるだけ同期されます...非同期とは、このタスクの完了中に他のタスクを実行することを意味します。それは並列実行です。
CodeAngry 2013年

17
これは非同期ではなく、curlを使用しているわけでもありません。どのように呼び出しcurl_post_asyncて賛成票を獲得するか
ダニエルW.

33

これは、POSTリクエストとGETリクエストの両方でMarquisの回答を機能させる方法です。

  // $type must equal 'GET' or 'POST'
  function curl_request_async($url, $params, $type='POST')
  {
      foreach ($params as $key => &$val) {
        if (is_array($val)) $val = implode(',', $val);
        $post_params[] = $key.'='.urlencode($val);
      }
      $post_string = implode('&', $post_params);

      $parts=parse_url($url);

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

      // Data goes in the path for a GET request
      if('GET' == $type) $parts['path'] .= '?'.$post_string;

      $out = "$type ".$parts['path']." HTTP/1.1\r\n";
      $out.= "Host: ".$parts['host']."\r\n";
      $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
      $out.= "Content-Length: ".strlen($post_string)."\r\n";
      $out.= "Connection: Close\r\n\r\n";
      // Data goes in the request body for a POST request
      if ('POST' == $type && isset($post_string)) $out.= $post_string;

      fwrite($fp, $out);
      fclose($fp);
  }

2
これは便利なコードスニペットであり、私はあちこちで使用していますが、同じことをSSLサイトで行う必要があることがわかりました。HTTP / 1.1タイプとポート以外に変更が必要なものはありますか?
Kevin Jhangiani

2
これをSSLに使用することについての質問への回答では、ポートを443に変更し、ssl://をfsockopenのポート名に追加することにより、SSLにすることができます。$ fp = fsockopen( "ssl://"。$ parts ['host ']、
マイケルドガー

1
「HTTP / 1.1タイプとポート以外に変更が必要なものはありますか?」-はい、fsockopen()はホスト名ssl://hostnameだけでなく、ホスト名を指定して呼び出す必要がありますhostname
カウルビー

22
これは非同期ではありません!特に、反対側のサーバーがダウンしている場合、このコードは30秒間ハングします(fsockopenの5番目のパラメーター)。また、fwriteは実行に甘い時間を費やします(stream_set_timeout($ fp、$ my_timeoutで制限できます)。最善の方法は、fsockopenのタイムアウトを0.1(100ms)に設定し、$ my_timeoutを100msに設定することです。 。あなたは、しかし、その要求のタイムアウトを危険にさらす。
クリス・チネリ

1
GETにはContent-Lengthを設定しないでください。多分いくつかのシナリオではエラーが発生しませんが、私の場合、呼び出されたphpスクリプトによってリクエストが処理されませんでした。
user3285954 2015年

13

更新に関して、ページ全体が読み込まれるのを待たないことについて-HTTP HEADリクエストがあなたが探しているものだと思います。

get_headersはこれを行う必要があります-ヘッダーを要求するだけなので、ページ全体のコンテンツは送信されません。

「PHP / Curl:一部のサイトでHEADリクエストに時間がかかる」では、PHP / CurlHEADを使用してリクエストを実行する方法について説明しています

リクエストをトリガーし、スクリプトをまったく行わない場合は、複雑さを変える方法がいくつかあります。

  • HTTPリクエストをバックグラウンドプロセスとして実行し、phpがバックグラウンドプロセスを実行します -基本的には次のようなものを実行します"wget -O /dev/null $carefully_escaped_url"-これはプラットフォーム固有であり、パラメーターをコマンドにエスケープすることについて本当に注意する必要があります
  • バックグラウンドでのPHPスクリプトの実行 -基本的にUNIXプロセスメソッドと同じですが、シェルコマンドではなくPHPスクリプトを実行します。
  • データベース(またはbeanstalkdのような過剰なもの)を使用して、「ジョブキュー」を用意します。キューにURLを追加すると、バックグラウンドプロセスまたはcronジョブが定期的に新しいジョブをチェックし、URLでリクエストを実行します

私がこれまでに考えたことのないさまざまな興味深いオプションの+1
Jasdeep Khalsa

「ヘッダーのみを要求すると思います」-おそらく、HEAD要求に応答して、ドキュメントが完全な応答本文を送信するのを止めることはできません。そして、私はこのメソッドが内部でfsockを使用し、完全な応答を待つ(そして読み取る)ことを強制することを想定しています。
hiburn8

6

あなたはしません。PHPはURLを呼び出す多くの方法を提供しますが、要求/実行サイクルごとにあらゆる種類の非同期/スレッド処理を実行するための箱からのサポートを提供していません。URL(またはSQLステートメントなど)の要求を送信する方法は、なんらかの応答を待ちます。これを達成するには、ローカルマシンで実行されているある種のセカンダリシステムが必要です( "phpジョブキュー"を検索してください)。


1
ここにハッキングがあります:stackoverflow.com/questions/124462/asynchronous-php-calls(クリスチャンダベンによる回答)ですが、キューを使用するのが正しい方法であることに同意します。
Chris Cinelli、2012年

2009年のこの回答は時代遅れだと思います。がつがつ食うPHPライブラリは、今や同時および非同期要求を行うことをサポートしています。
Simon East

6

十分にテストされたPHPライブラリをお勧めします:curl-easy

<?php
$request = new cURL\Request('http://www.externalsite.com/script2.php?variable=45');
$request->getOptions()
    ->set(CURLOPT_TIMEOUT, 5)
    ->set(CURLOPT_RETURNTRANSFER, true);

// add callback when the request will be completed
$request->addListener('complete', function (cURL\Event $event) {
    $response = $event->response;
    $content = $response->getContent();
    echo $content;
});

while ($request->socketPerform()) {
    // do anything else when the request is processed
}

がつがつ食うPHPライブラリはまた、同時および非同期要求を行うことをサポートしています。
Simon East

Guzzleはサポートしていると主張していますが、postAsyncメソッドをテストすると、同期的に150ミリ秒、非同期的に2ミリ秒のように見えます。私はそれを修正するために1時間以上費やしましたが、成功しませんでした-お勧めしません。
Velizar Hristov

4

Linux環境を使用している場合は、PHPのexecコマンドを使用してLinux curlを呼び出すことができます。以下は、非同期HTTPポストを作成するサンプルコードです。

function _async_http_post($url, $json_string) {
  $run = "curl -X POST -H 'Content-Type: application/json'";
  $run.= " -d '" .$json_string. "' " . "'" . $url . "'";
  $run.= " > /dev/null 2>&1 &";
  exec($run, $output, $exit);
  return $exit == 0;
}

このコードは追加のPHPライブラリを必要とせず、10ミリ秒未満でhttp投稿を完了できます。


1
これは非常に悪い考えです:execは非常に失敗します:6/200クライアントが支払われた予約の電子メール確認を受信しないと想像してください...
HellBaby

これは、別のサーバーで別のスクリプトを開始するためにpingが必要なだけで、私にとってはうまくいきました。私はそれをそのように使用しました:_async_http_post($ url、 ''); そして、これはOVHの相互化されたサーバーで動作しています...素晴らしいです。
Kilowog

4
function make_request($url, $waitResult=true){
    $cmi = curl_multi_init();

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($cmi, $curl);

    $running = null;
    do {
        curl_multi_exec($cmi, $running);
        sleep(.1);
        if(!$waitResult)
        break;
    } while ($running > 0);
    curl_multi_remove_handle($cmi, $curl);
    if($waitResult){
        $curlInfos = curl_getinfo($curl);
        if((int) $curlInfos['http_code'] == 200){
            curl_multi_close($cmi);
            return curl_multi_getcontent($curl);
        }
    }
    curl_multi_close($cmi);
}

getstatus()or waitSend()またはを呼び出すことができるオブジェクトを返すようにすることもできますwaitResult()。このように、呼び出し元はループで呼び出して結果が存在するかどうかを確認し、存在しない場合は実行中の他のタスクを続行することにより、完全に非同期の動作を取得できます。うーん、今Task、.netからphp に移植したいと思います…
binki

3

興味深い問題。他のサーバーで何らかのプロセスまたはアクションをトリガーしたいだけだと思いますが、結果は気にせず、スクリプトを続行してください。これを可能にする何かがcURLにある可能性がありますがexec()、cURLがそれを実行できない場合に、呼び出しを行うサーバーで別のスクリプトを実行することを検討することをお勧めします。(通常、人々はスクリプト呼び出しの結果を望んでいるので、PHPがプロセスをトリガーするだけの能力を持っているかどうかはわかりません。)を使用して、を使用してリクエストを行うPHPスクリプトをexec()実行することもできます。wgetfile_get_conents()


2

アドバイスされた方法ではなく、メッセージキューの使用を検討することをお勧めします。リクエストを送信するよりも少し多くの作業が必要ですが、これはより良い解決策になると確信しています。


2

私の方法をお見せしましょう:)

サーバーにnodejsがインストールされている必要があります

(私のサーバーは1000のhttps getリクエストを送信するのにわずか2秒かかります)

url.php:

<?
$urls = array_fill(0, 100, 'http://google.com/blank.html');

function execinbackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
} 
fwite(fopen("urls.txt","w"),implode("\n",$urls);
execinbackground("nodejs urlscript.js urls.txt");
// { do your work while get requests being executed.. }
?>

urlscript.js>

var https = require('https');
var url = require('url');
var http = require('http');
var fs = require('fs');
var dosya = process.argv[2];
var logdosya = 'log.txt';
var count=0;
http.globalAgent.maxSockets = 300;
https.globalAgent.maxSockets = 300;

setTimeout(timeout,100000); // maximum execution time (in ms)

function trim(string) {
    return string.replace(/^\s*|\s*$/g, '')
}

fs.readFile(process.argv[2], 'utf8', function (err, data) {
    if (err) {
        throw err;
    }
    parcala(data);
});

function parcala(data) {
    var data = data.split("\n");
    count=''+data.length+'-'+data[1];
    data.forEach(function (d) {
        req(trim(d));
    });
    /*
    fs.unlink(dosya, function d() {
        console.log('<%s> file deleted', dosya);
    });
    */
}


function req(link) {
    var linkinfo = url.parse(link);
    if (linkinfo.protocol == 'https:') {
        var options = {
        host: linkinfo.host,
        port: 443,
        path: linkinfo.path,
        method: 'GET'
    };
https.get(options, function(res) {res.on('data', function(d) {});}).on('error', function(e) {console.error(e);});
    } else {
    var options = {
        host: linkinfo.host,
        port: 80,
        path: linkinfo.path,
        method: 'GET'
    };        
http.get(options, function(res) {res.on('data', function(d) {});}).on('error', function(e) {console.error(e);});
    }
}


process.on('exit', onExit);

function onExit() {
    log();
}

function timeout()
{
console.log("i am too far gone");process.exit();
}

function log() 
{
    var fd = fs.openSync(logdosya, 'a+');
    fs.writeSync(fd, dosya + '-'+count+'\n');
    fs.closeSync(fd);
}

1
これは純粋なPHPソリューションではありません。
binki

2

私にとって、非同期GETリクエストに関する質問が表示されるのは、何百ものリクエストを実行し、すべてのリクエストの結果データを取得して処理する必要があり、すべてのリクエストの実行に数ミリ秒かかるため、数分(!)シンプルでトータル実行file_get_contents

この場合、関数http://php.net/manual/en/function.curl-multi-init.phpのphp.netでのw_haighの非常に役立つコメントでした。

だから、これは多くのリクエストを同時に行う私のアップグレードされたバージョンです。私の場合、これは「非同期」の方法と同等です。それは誰かのために役立つかもしれません!

// Build the multi-curl handle, adding both $ch
$mh = curl_multi_init();

// Build the individual requests, but do not execute them
$chs = [];
$chs['ID0001'] = curl_init('http://webservice.example.com/?method=say&word=Hello');
$chs['ID0002'] = curl_init('http://webservice.example.com/?method=say&word=World');
// $chs[] = ...
foreach ($chs as $ch) {
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,  // Return requested content as string
        CURLOPT_HEADER => false,         // Don't save returned headers to result
        CURLOPT_CONNECTTIMEOUT => 10,    // Max seconds wait for connect
        CURLOPT_TIMEOUT => 20,           // Max seconds on all of request
        CURLOPT_USERAGENT => 'Robot YetAnotherRobo 1.0',
    ]);

    // Well, with a little more of code you can use POST queries too
    // Also, useful options above can be  CURLOPT_SSL_VERIFYHOST => 0  
    // and  CURLOPT_SSL_VERIFYPEER => false ...

    // Add every $ch to the multi-curl handle
    curl_multi_add_handle($mh, $ch);
}

// Execute all of queries simultaneously, and continue when ALL OF THEM are complete
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running);

// Close the handles
foreach ($chs as $ch) {
    curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);

// All of our requests are done, we can now access the results
// With a help of ids we can understand what response was given
// on every concrete our request
$responses = [];
foreach ($chs as $id => $ch) {
    $responses[$id] = curl_multi_getcontent($ch);
    curl_close($ch);
}
unset($chs); // Finita, no more need any curls :-)

print_r($responses); // output results

POSTや他のタイプのHTTP(S)リクエスト、またはそれらの任意の組み合わせを処理するようにこれを書き換えることは簡単です。Cookieのサポート、リダイレクト、http-authなど。


ああ.. 2009年に作成された質問を見て、私は2016年に私の答えを書きます:)しかし、私たちの多くのGoogle phpは非同期になり、ここに来ました。
FlameStorm

はい、グーグルの時もここに来ました。一部のコーダーは、同時および非同期リクエストの実行をサポートするGuzzle PHPライブラリを調べたい場合もあります。
Simon East

1

試してください:

//Your Code here
$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
}
else if ($pid)
{
echo("Bye")  
}
else
{
     //Do Post Processing
}

これはapacheモジュールとしては機能しません。CGIを使用する必要があります。


1

非同期処理(get request)を実行するこの興味深いリンクを見つけました。

Askapache

さらに、たとえばbeanstalkdなどのメッセージキューを使用して、非同期処理を実行できます。


1

これは、単純なGETリクエストを実行するための受け入れられた回答の適応です。

サーバーがURLの書き換えを行う場合は、これは機能しません。よりフル機能のhttpクライアントを使用する必要があります。

  /**
   * Performs an async get request (doesn't wait for response)
   * Note: One limitation of this approach is it will not work if server does any URL rewriting
   */
  function async_get($url)
  {
      $parts=parse_url($url);

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

      $out = "GET ".$parts['path']." HTTP/1.1\r\n";
      $out.= "Host: ".$parts['host']."\r\n";
      $out.= "Connection: Close\r\n\r\n";
      fwrite($fp, $out);
      fclose($fp);
  }

1

上に投稿されたスクリプトのほんの少しの修正。以下は私のために働いています

function curl_request_async($url, $params, $type='GET')
    {
        $post_params = array();
        foreach ($params as $key => &$val) {
            if (is_array($val)) $val = implode(',', $val);
            $post_params[] = $key.'='.urlencode($val);
        }
        $post_string = implode('&', $post_params);

        $parts=parse_url($url);
        echo print_r($parts, TRUE);
        $fp = fsockopen($parts['host'],
            (isset($parts['scheme']) && $parts['scheme'] == 'https')? 443 : 80,
            $errno, $errstr, 30);

        $out = "$type ".$parts['path'] . (isset($parts['query']) ? '?'.$parts['query'] : '') ." HTTP/1.1\r\n";
        $out.= "Host: ".$parts['host']."\r\n";
        $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
        $out.= "Content-Length: ".strlen($post_string)."\r\n";
        $out.= "Connection: Close\r\n\r\n";
        // Data goes in the request body for a POST request
        if ('POST' == $type && isset($post_string)) $out.= $post_string;
        fwrite($fp, $out);
        fclose($fp);
    }

私は問題を抱えています、fwriteは正のバイト数を返しますが、スクリプトエンドポイントは呼び出されません(ログは記録されません)。 、128); }
ミゲル

1

HTTPリクエストを簡単に送信できるPHP HTTPクライアントであるGuzzleについては誰も触れていないようです。これは、使用してもしなくても機能しCurlます。同期リクエストと非同期リクエストの両方を送信できます。

$client = new GuzzleHttp\Client();
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(
    function (ResponseInterface $res) {
        echo $res->getStatusCode() . "\n";
    },
    function (RequestException $e) {
        echo $e->getMessage() . "\n";
        echo $e->getRequest()->getMethod();
    }
);

はい、このスレッドの回答の多くはかなり古くなっていますが、投稿してくれてありがとう、Guzzleは2018年に出会った中で最高の選択肢です。
Simon East

0

このスレッドに基づいて、私はcodeigniterプロジェクト用にこれを作成しました。正常に動作します。バックグラウンドで処理される任意の機能を持つことができます。

非同期呼び出しを受け入れるコントローラー。

class Daemon extends CI_Controller
{
    // Remember to disable CI's csrf-checks for this controller

    function index( )
    {
        ignore_user_abort( 1 );
        try
        {
            if ( strcmp( $_SERVER['REMOTE_ADDR'], $_SERVER['SERVER_ADDR'] ) != 0 && !in_array( $_SERVER['REMOTE_ADDR'], $this->config->item( 'proxy_ips' ) ) )
            {
                log_message( "error", "Daemon called from untrusted IP-address: " . $_SERVER['REMOTE_ADDR'] );
                show_404( '/daemon' );
                return;
            }

            $this->load->library( 'encrypt' );
            $params = unserialize( urldecode( $this->encrypt->decode( $_POST['data'] ) ) );
            unset( $_POST );
            $model = array_shift( $params );
            $method = array_shift( $params );
            $this->load->model( $model );
            if ( call_user_func_array( array( $this->$model, $method ), $params ) === FALSE )
            {
                log_message( "error", "Daemon could not call: " . $model . "::" . $method . "()" );
            }
        }
        catch(Exception $e)
        {
            log_message( "error", "Daemon has error: " . $e->getMessage( ) . $e->getFile( ) . $e->getLine( ) );
        }
    }
}

そして、非同期呼び出しを行うライブラリ

class Daemon
{
    public function execute_background( /* model, method, params */ )
    {
        $ci = &get_instance( );
        // The callback URL (its ourselves)
        $parts = parse_url( $ci->config->item( 'base_url' ) . "/daemon" );
        if ( strcmp( $parts['scheme'], 'https' ) == 0 )
        {
            $port = 443;
            $host = "ssl://" . $parts['host'];
        }
        else 
        {
            $port = 80;
            $host = $parts['host'];
        }
        if ( ( $fp = fsockopen( $host, isset( $parts['port'] ) ? $parts['port'] : $port, $errno, $errstr, 30 ) ) === FALSE )
        {
            throw new Exception( "Internal server error: background process could not be started" );
        }
        $ci->load->library( 'encrypt' );
        $post_string = "data=" . urlencode( $ci->encrypt->encode( serialize( func_get_args( ) ) ) );
        $out = "POST " . $parts['path'] . " HTTP/1.1\r\n";
        $out .= "Host: " . $host . "\r\n";
        $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
        $out .= "Content-Length: " . strlen( $post_string ) . "\r\n";
        $out .= "Connection: Close\r\n\r\n";
        $out .= $post_string;
        fwrite( $fp, $out );
        fclose( $fp );
    }
}

このメソッドは、「バックグラウンド」で任意のmodel :: method()を処理するために呼び出すことができます。可変引数を使用します。

$this->load->library('daemon');
$this->daemon->execute_background( 'model', 'method', $arg1, $arg2, ... );

0

提案:9つのフレームを含むフレームセットHTMLページをフォーマットします。各フレームは、myapp.phpページの異なる「インスタンス」を取得します。Webサーバー上では、9つの異なるスレッドが並行して実行されます。


0

PHP5.5以降では、mpyw / coが究極のソリューションです。それがあるかのように動作しますTJ /共同 JavaScriptをインチ

指定した複数のGitHubユーザーのアバターをダウンロードするとします。ユーザーごとに次の手順が必要です。

  1. http://github.com/mpyw(GET HTML)のコンテンツを取得する
  2. 検索<img class="avatar" src="...">してリクエストする(GET IMAGE)

---:私の応答を待ってい
...ます:並列フローで他の応答を待っています

多くの有名なcurl_multiベースのスクリプトは、すでに次のフローを提供しています。

        /-----------GET HTML\  /--GET IMAGE.........\
       /                     \/                      \ 
[Start] GET HTML..............----------------GET IMAGE [Finish]
       \                     /\                      /
        \-----GET HTML....../  \-----GET IMAGE....../

ただし、これは十分に効率的ではありません。無駄な待ち時間を減らしたい...ですか?

        /-----------GET HTML--GET IMAGE\
       /                                \            
[Start] GET HTML----------------GET IMAGE [Finish]
       \                                /
        \-----GET HTML-----GET IMAGE.../

はい、mpyw / coを使用すると非常に簡単です。詳細については、リポジトリページにアクセスしてください。


-1

これは、任意のページの特定のURLに対してPOSTを実行するときの私の独自のPHP関数です。

サンプル:*関数の使用法...

<?php
    parse_str("email=myemail@ehehehahaha.com&subject=this is just a test");
    $_POST['email']=$email;
    $_POST['subject']=$subject;
    echo HTTP_Post("http://example.com/mail.php",$_POST);***

    exit;
?>
<?php
    /*********HTTP POST using FSOCKOPEN **************/
    // by ArbZ

    function HTTP_Post($URL,$data, $referrer="") {

    // parsing the given URL
    $URL_Info=parse_url($URL);

    // Building referrer
    if($referrer=="") // if not given use this script as referrer
      $referrer=$_SERVER["SCRIPT_URI"];

    // making string from $data
    foreach($data as $key=>$value)
      $values[]="$key=".urlencode($value);
    $data_string=implode("&",$values);

    // Find out which port is needed - if not given use standard (=80)
    if(!isset($URL_Info["port"]))
      $URL_Info["port"]=80;

    // building POST-request: HTTP_HEADERs
    $request.="POST ".$URL_Info["path"]." HTTP/1.1\n";
    $request.="Host: ".$URL_Info["host"]."\n";
    $request.="Referer: $referer\n";
    $request.="Content-type: application/x-www-form-urlencoded\n";
    $request.="Content-length: ".strlen($data_string)."\n";
    $request.="Connection: close\n";
    $request.="\n";
    $request.=$data_string."\n";

    $fp = fsockopen($URL_Info["host"],$URL_Info["port"]);
    fputs($fp, $request);
    while(!feof($fp)) {
        $result .= fgets($fp, 128);
    }
    fclose($fp); //$eco = nl2br();

    function getTextBetweenTags($string, $tagname) {
        $pattern = "/<$tagname ?.*>(.*)<\/$tagname>/";
        preg_match($pattern, $string, $matches);
        return $matches[1]; }
    //STORE THE FETCHED CONTENTS to a VARIABLE, because its way better and fast...
    $str = $result;
    $txt = getTextBetweenTags($str, "span"); $eco = $txt;  $result = explode("&",$result);
    return $result[1];
<span style=background-color:LightYellow;color:blue>".trim($_GET['em'])."</span>
</pre> "; 
}
</pre>

-2

このコードを試してください...

$chu = curl_init();

curl_setopt($chu, CURLOPT_URL, 'http://www.myapp.com/test.php?someprm=xyz');

curl_setopt($chu, CURLOPT_FRESH_CONNECT, true);
curl_setopt($chu, CURLOPT_TIMEOUT, 1);

curl_exec($chu);
curl_close($chu);

CURL php拡張機能を有効にすることを忘れないでください。


CURLOPT_TIMEOUT_MSたとえば、100ミリ秒を設定できます。代わりCURLOPT_TIMEOUTに秒単位で、1秒の最小値があります-より高速に実行できます。
Jason Silver

-5

これは私にとってはうまくいきますが、残念ながら、リクエストから応答を取得することはできません。

<?php
header("http://mahwebsite.net/myapp.php?var=dsafs");
?>

それは非常に速く動作し、生のTCPソケットは必要ありません:)


この関数は、応答にヘッダーを追加します...ヘッダー要求を送信していません。 php.net/manual/bg/function.header.php
Lachezar Todorov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.