2017-03-24 3 views
3

Es kann eine dumme Frage, aber ich kann nicht dachte, es leicht heraus, warum es wie dieseWie gleichzeitig Ajax-Aufruf laufen - php

verhält Ich habe zwei Ajax-Aufruf Funktion,

execCommand() : für Shell-Befehl durch ausführen php

shell_exec ('ping 127.0.0.1> ../var/log/tmp.log');

GETLOG(): zum Sammeln von Protokollen von execCommand() [../var/log/tmp.log] und Anzeige Benutzer [lesen Live]

Echo file_get_contents (.. /var/log/tmp.log);

Dies ist der Jquery Ajax-Skript ist

$("#docker_install_fek").on("click",function(){ 

     $('#progress-window').show(); 
     getLog(); 
     execCommand(); 
    }); 

    function execCommand(){ 

     $.ajax({ 
      url: '<?php echo $block->getUrl('meta/reports/ajax',[]);?>', 
      type: 'POST', 
      data:{ip:$("#ip").val()}, 
      success: function(data) { 
       alert(data); 
      }, 
      error: function() { 
       alert("fail"); 
      } 
     }); 

    } 
    function getLog() { 

     $.ajax({ 
      type: "GET", 
      url: "<?php echo $block->getUrl('meta/reports/progress',[]);?>", 
      dataType: "text", 
      success: function (data) { 
       $("#progress-window").empty(); 
       $("#progress-window").append("<pre>"+data+"</pre>"); 
       $("#progress-window").scrollTop(1E10); 
       setTimeout(getLog, 3000); 
      }, 
      headers: { 
       "Range" : "bytes=-500" 
      } 
     }); 
    } 

ich in Firebug net Registerkarte bemerken, beide Ajax-Aufrufe werden geladen, aber es nie das Protokoll, bis execCommand() beendet die Ausführung machen.

Ich weiß nicht, was ist der Hauptgrund, ich testen wie run ping 127.0.0.1 > ../var/log/tmp.log von Terminal dann comment execCommand() jetzt getLog() Funktion Update-Protokolldatei alle 3 Sekunden.

+0

Ich bin auf Wordpress das gleiche Problem konfrontiert. Hoffe, dass jemand antworten wird. Auch in Chrome. –

+0

Haben Sie versucht, http://php.net/manual/en/function.session-write-close.php zu verwenden, bevor Sie 'shell_exec' aufrufen? – Panther

+0

Eine Vermutung wäre, die 'alert' Anweisungen von' execCommand() 'zu entfernen. Warnungen blockieren den Browser. Es besteht die Möglichkeit, dass der Befehl 'execCommand()' zuerst abgeschlossen wird und die Warnung den Browser blockiert. Versuchen Sie es stattdessen mit 'console.log' zu ersetzen. – 31piy

Antwort

0

Sie verwenden Sitzungen. Auf der Serverseite sind Sitzungen gesperrt, sodass Sie die Sitzungsdateien jeweils nur mit einem Skript öffnen können.

Wenn Sie serverseitige Skripts haben, die nicht blockierend sein sollten, dann verwenden Sie session_start() nicht in ihnen, oder stellen Sie sicher, dass Sie die Sitzung so bald wie möglich mit session_write_close() schließen Skripte zum Ausführen.

Verwandte Themen