PHP18 Novembre 2015by Daniele Carnovale128Eseguire php da un altro file php in modo asincrono, PHP Asincrona

Come eseguire php da un altro file php in modo asincrono. PHP asincrona

Spesso durante l’esecuzione di un file php è molto utile intercettare un evento e far partire in parallelo un altro processo, eseguendo un altro file php.

Ad esempio in alcuni casi si può essere utile separare alcuni sotto processi per velocizzare il caricamento delle pagine.

Oppure in alcuni casi bisogna eseguire del codice php, dispendioso e lento, di cui il risultato non è rilevante per la visualizzazione della pagina corrente o non serve nell’immediato.

Un altro esempio potrebbe essere quello dell’invio di un’email tramite un servizio di posta sul un server differente da quello in esecuzione del proprio file php.

Per tutti gli esempi descritti basta creare una chiamata php asincrona.

Per eseguire un file php in modo asincrono basta aprire un socket e simulare una chiamata esterna da browser al server. Tutto questo con una semplice funzione php ( JobStartAsync ) .

—————————— File phpasincrono.php —————————————-

//Parametri chiave-valore da inviare via post

$post = array(
"chiave1" =>'valore1',
"chiave2" => ' valore2 '
);

// la funzione riceve in input ip path e array post

// eventuali parametri get si possono aggiungere al path

JobStartAsync('192.168.0.1', '/phathweb/filedaeseguire.php',$post);

// l'esecuzione può continuare senza interruzione

function JobStartAsync ($server, $url, $post_array,$noasync=false, $port = 80, $conn_timeout = 60, $rw_timeout = 86400)
{

// echo 'JobStartAsync';

$errno = '';
$errstr = '';

set_time_limit(0);
$post_data = '';
foreach ($post_array as $k => $v) {
$post_data .= $k . '=' . $v . '&';
}
$fp = fsockopen($server, $port, $errno, $errstr, $conn_timeout);
if (!$fp) {

echo 'open socket errore';

return false;
}
$out = "POST " . $url . " HTTP/1.1\r\n";
$out .= "Host: $server\r\n";
$out .= "User-Agent: " . $_SERVER['HTTP_USER_AGENT'] . "\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-length: " . strlen($post_data) . "\r\n";
$out .= "Connection: close\r\n\r\n";
$out .= $post_data . "\r\n\r\n";

stream_set_blocking($fp, false);
stream_set_timeout($fp, $rw_timeout);
fwrite($fp, $out);

// per poter testare il funzionamento del file eseguito da chiamata socket

// bisogna restare in ascolto sul socket aperto e magari stampare la risposta

// così facendo la funzione non risulta più asincrona

if ($noasync) {
while (!feof($fp)) {
echo fgets($fp, 128);
}
}

fclose($fp);
return $fp;
}

—————————— fine File phpasincrono.php —————————————-

 

128 comments

Leave a Reply

Your email address will not be published. Required fields are marked *