Asenkron PHP çağırır?

8 Cevap php

Asenkron http aramaları yapmak için PHP bir yolu var mı? Ben sadece file_get_contents() gibi bir şey yapmak istiyorum, tepki umurumda değil, ama istek benim kod kalanını çalıştırmadan önce bitirmek için beklemek yok. Bu benim uygulamada bir tür "olayları" yola, ya da uzun süreçleri tetikleme için süper yararlı olacaktır.

Herhangi bir fikir?

8 Cevap

Ben önceden kabul ediyorum cevabı işe yaramadı. Hala yanıtları için bekledi. Bu çalışıyor olsa da, alınan How do I make an asynchronous GET request in PHP?

function post_without_wait($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);
}

this needs php5, i stole it out of docs.php.net and edited the end.

Bir hata bir müşteri sitede olur ben izlenmesi için kullanmak, bu çıkışını tutmadan kapalı bana veri gönderir

function do_post_request($url, $data, $optional_headers = null,$getresponse = false) {
      $params = array('http' => array(
                   'method' => 'POST',
                   'content' => $data
                ));
      if ($optional_headers !== null) {
         $params['http']['header'] = $optional_headers;
      }
      $ctx = stream_context_create($params);
      $fp = @fopen($url, 'rb', false, $ctx);
      if (!$fp) {
        return false;
      }
      if ($getresponse){
        $response = stream_get_contents($fp);
        return $response;
      }
    return true;
}

Wez Furlong bunu nasıl gösterdi:

http://netevil.org/blog/2005/may/guru-multiplexing

O-PHP4 ve bunun PHP5 uyumlu uygulamalar hem de verilmiştir.

Eğer (örneğin kendi "longtask.php") uyumsuz aramak istediğiniz hedefini kontrol ederseniz, bu amaçla gelen bağlantıyı kapatabilir, hem komut paralel olarak çalışacaktır. Bu gibi çalışır:

  1. quick.php cURL yoluyla longtask.php açılır (sihirli burada)
  2. longtask.php bağlantıyı kapatır ve devam eder (magic!)
  3. cURL bağlantısı kapatıldığında quick.php döner
  4. Her iki görev paralel olarak devam

Bunu denedim ve gayet güzel çalışıyor. Eğer süreçler arasında bazı iletişim araçlarını oluşturmak sürece Ancak, longtask.php yapıyor nasıl hakkında bir şey quick.php bilmeyecek.

Eğer başka bir şey yapmadan önce, longtask.php bu kodu deneyin. Bu bağlantıyı kapatın, ama hala çalışır (ve herhangi bir çıktı bastırmak) devam edecek:

while(ob_get_level()) ob_end_clean();
header('Connection: close');
ignore_user_abort();
ob_start();
echo('Connection Closed');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();

Kod PHP manual's user contributed notes kopyalanan ve biraz artırıldı.

Sen wget gibi, HTTP isteklerini yapabileceği bir şey çağırmak için) (exec kullanarak hile yapabilir, ancak aksi takdirde, bir dosya ya da / dev / null gibi bir yere programdan tüm çıktıyı yönlendirmek gerekir PHP süreç çıkış için bekleyecektir.

Tamamen apache parçacığı sürecini ayırmak istiyorsanız, gibi bir şey (ben bu konuda emin değilim, ama fikir olsun umut) deneyin:

exec('bash -c "wget -O (url goes here) > /dev/null 2>&1 &"');

Bu güzel bir iş değil, ve muhtemelen gerçek olmayan olayları yapmak için bir kalp atışı komut anketler gerçek bir veritabanı olay sırası çağırarak bir cron işi gibi bir şey isteyeceksiniz.

Bana sen benim yol göstereyim :)

sunucuda yüklü nodejs ihtiyacı

(Benim sunucu 1000 https olsun talebi sadece 2 saniye sürer gönderir)

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

Guzzle PHP HTTP istemci bir AsyncPlugin sağlar. Bu sizin için ne arıyorsanız olabilir. http://guzzlephp.org/guide/plugins.html#async-plugin

Bu size yazacağım şey daha çok daha kapsamlı çok güzel belgelerine sahiptir ve bir çok test ediyor çünkü PHPLiveX gibi bunun için bir çerçeve kullanarak öneriyoruz.