2015-10-23 27 views
5

Ich möchte eine Fortschrittsleiste mit dem Status meiner PHP-Skript erstellen. Ich habe gelesen, dass es mit session.upload_progress getan werden könnte.Laravel 5.1 mit session.upload_progress

Ich benutze Laravel Homestead und in der php.ini sind alle Requirements aktiv.

Das ist mein html

{!! Form::open(['route' => 'gebruikers_upload', 'class' => 'form-horizontal import', 'enctype' => 'multipart/form-data', 'target' => 'hidden_iframe']) !!} 
          <input type="hidden" value="myForm" name="{{ini_get("session.upload_progress.name")}}"> 
          <input type="file" name="file" id="the-file"/> 
          <button class="btn btn-sm btn-info btn_import" type="submit">Importeer</button> 
          <button class="btn btn-sm btn-danger" type="button">Cancel</button> 
         {!! Form::close() !!} 
         {{--End Form--}} 

         <iframe id="hidden_iframe" name="hidden_iframe" src="about:blank"></iframe> 

         <div class="progress"> 
          <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="25" 
            aria-valuemin="0" aria-valuemax="100" style="width: 45%"> 
           <span class="">45% Complete</span> 
          </div> 
         </div> 

Wenn te Route submiting ist:

Route::get('dashboard/gebruikers/upload_status', '[email protected]'); 

Und in der Steuerung Usercontroller in Verfahren uploadStatus habe ich dieses

public function uploadStatus(Request $request) 
{ 
    session_start(); 

    echo '<pre>'; 
     print_r($_SESSION); 
    echo '</pre>'; 
} 

Aber es zeigt immer ein leeres Array an. Und wenn ich diesen Code verwenden

$data = $request->session()->all(); 

    echo '<pre>'; 
    print_r($data); 
    echo '</pre>'; 

Es gibt diese

Array 
(
    [_token] => jFkleI9kIZJiZP3pEARx0hDrHtsynPmuGkse97nT 
    [_previous] => Array 
     (
      [url] => http://localhost.dev:8000/dashboard/gebruikers/upload_status 
     ) 

    [flash] => Array 
     (
      [old] => Array 
       (
       ) 

      [new] => Array 
       (
       ) 

     ) 

    [login_82e5d2c56bdd0811318f0cf078b78bfc] => 1 
) 

Aber es gibt keine Informationen über Fortschritte Aktualisierung.

Wie konnte ich verwenden diese mit Laravel 5,1

Antwort

1

Laravel Documentation alle Methoden hat man mit der Sitzung zu verwirren müssen.

$request->session()->put('key', 'value'); 

Sie können einfach alles, was Sie wünschen, so in die Sitzung einfügen.

Als Helfer Kurzschrift Laravel bietet Ihnen session() Hilfsfunktion. Welche akzeptieren ein Array von "Schlüssel-Wert-Paare", um Werte oder nur einen Schlüssel, um einen Wert aus der Sitzung abzurufen.

3

Ich stieß auf dieses Problem, als ich versuchte, ein ähnliches Problem zu lösen: den Fortschritt eines lang andauernden Prozesses auf der Client-Seite zu aktualisieren.

Das Problem kommt auf: Wenn Sie eine Anfrage an den Server stellen, werden die Sitzungswerte nicht in den Sitzungsspeicher geschrieben, bis die Antwort an den Client zurückgegeben wird. Grundsätzlich sieht der Prozess wie folgt aus:

 CLIENT   |  SERVER 
         |    . 
send request  ----|----> start processing 
         |    . 
         |    . 
         |    . 
         |  finish processing 
         |  write session values 
receive response <----|---- return response 

Was Sie tun, ist so etwas wie dieses:

 CLIENT   |  SERVER 
         |    . 
send request  ----|----> start processing 
         |    . 
         |  (update session) 
         |    . 
         |  (update session) 
         |    . 
         |  (update session) 
         |    . 
         |  finish processing 
         |  write session values 
receive response <----|---- return response 

Aber diese (update session) Anrufe auf dem Server ignoriert werden - sie sind nicht wirklich geschrieben bedürftig der Sitzungsspeicher. Wenn der Client also einen Aufruf an Ihre Route aufruft, um den Sitzungswert für den Fortschritt anzufordern, erhält er nichts.

Die Lösung ist einfach: Schreiben Sie den Fortschrittswert woanders. Vor langer Zeit habe ich das gelöst, indem ich den Wert mit file_put_contents in eine Datei geschrieben habe. Wenn ich es heute tun würde, würde ich wahrscheinlich einen redis Server für bessere Effizienz betrachten.

Eine Sache jedoch zu beachten: Wenn Sie den Wert irgendwo anders schreiben möchten, müssen Sie eine Möglichkeit haben, den Wert mit der Sitzung zu verknüpfen. Andernfalls überschreiben andere Benutzer Ihren Wert.Für ein einfaches Projekt würde ich wahrscheinlich den ID-Wert des Benutzers verwenden (unter der Annahme, dass sie nur eine Sache auf einmal verarbeiten werden).

+0

Das ist richtig, wenn Sie illuminate/session Paket außerhalb von Laravel verwenden, müssen Sie die 'save' Methode in der SessionManager-Instanz aufrufen, um die Aktualisierungen der Variablen' $ _SESSION' zu speichern. –