2016-04-15 20 views
0

Zunächst einmal Windows verwenden.PHP Exec-Funktion funktioniert nicht gut

Ich habe den folgenden Code:

index.php

<?php 
    error_reporting(E_ALL); 
    $tiempo_inicio = microtime(true); 
    exec('C:\wamp\bin\php\php5.5.12\php.exe -e C:\wamp\www\mail.php > /dev/null &'); 
    $tiempo_fin = microtime(true); 
    echo ($tiempo_fin - $tiempo_inicio); 
    ?> 

Mail.php

<?php 
$tiempo_inicio = microtime(true); 
    $logs = fopen("test.txt","a+"); 
    sleep(2); 
    $tiempo_fin = microtime(true); 
    fwrite($logs, ($tiempo_fin - $tiempo_inicio)." 
    "); 
    sleep(4); 
    $tiempo_fin = microtime(true); 
    fwrite($logs, ($tiempo_fin - $tiempo_inicio)." 
    "); 
    sleep(6); 
    $tiempo_fin = microtime(true); 
    fwrite($logs, ($tiempo_fin - $tiempo_inicio)." 
    "); 
    echo 'fin'; 
?> 

Aber es funktioniert nicht wie ich hoffe, weil das, was ich will Lauf ist Die Datei im Hintergrund ohne den Benutzer wartet auf die Fertigstellung dieser Datei.

Was mache ich falsch?

+1

Ich denke & Prozess im Hintergrund zu laufen Linux ist. Obwohl ich kein Windows-Benutzer bin, denke ich aber, dass Sie hier falsch liegen. Eine bessere Methode wäre es auch, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'an. Wenn der Hintergrundjob schwer ist, ist die Wahrscheinlichkeit eines Serverabsturzes geringer – georoot

Antwort

0

ich Erfolg in der Vergangenheit unter Windows hatte mit pclose/popen und dem Windows-Startbefehl statt exec. Der Nachteil ist, dass es schwierig ist, auf Fehler in dem von Ihnen aufgerufenen Programm zu reagieren.

würde ich so etwas wie dies versuchen (Ich bin nicht auf einer Maschine dieses heute zu testen):

$command_string = 'C:\wamp\bin\php\php5.5.12\php.exe -f "C:\wamp\www\mail.php" -- variablestopass'; 

pclose(popen("start /B ".$command_string, 'r')); 
1

Sie sprechen von einer nicht blockierenden Ausführung (wo ein Prozess nicht auf einen anderen wartet. PHP kann das wirklich nicht (nativ sowieso), weil es um einen einzigen Thread herum aufgebaut ist. Ohne zu wissen, was Prozess tut ich genau dies nicht kommentieren kann, aber ich kann einige Vorschläge

  • asynchrone Ausführung über AJAX Betrachten machen. Marrying Ihr Skript zu einem Javascript ermöglicht der Client die Anforderung tun und lässt Ihre PHP-Skript frei laufen, während AJAX öffnet Eine weitere Anfrage, die die Aktivität auf der Hauptseite nicht blockiert, stellen Sie sicher, dass der Benutzer visuell weiß, dass Sie auf Daten warten
  • pthreads (repo) - Multi-Thread-PHP. Öffnet einen anderen Prozess in einem anderen Thread.
  • Gearman - Ähnlich wie Pthreads, aber auch automatisierbar
  • cron job - Voll asynchron. Führt einen Prozess in regelmäßigen Abständen aus. Bedenken Sie, dass es tun könnte, sagen wir, Datenaggregation und das Skript auf den aggregierten Daten abruft
Verwandte Themen