2016-11-29 3 views
1

ユーザーがファイルをアップロードし、ソフトウェアがそのファイルを暗号化するプロセスを開始するPHPプロジェクトがあります。ユーザーが新しいファイルをアップロードした直後にプロセスを開始するにはどうすればよいですか?

このプロセスでは、暗号化に約5-7分かかります。

しかし、暗号化プロセスが進行中の場合、別のユーザーとの間でファイルをアップロードします。その後、プロセスが停止し、プロセスが再び開始されます。

これを解決するために、新しいファイルのファイルパスがFIFO形式で保存されていても、新しいファイルが追加されるとプロセスが再び開始されるプロセステーブルを作成しました。

プロセスが停止せず、ファイルがターンを待つべきであることをどうしたらよいですか?

$sql="SELECT * FROM tbl_process"; 
$result = mysqli_query($con,$sql); 
$countforh = mysqli_num_rows($result); 
for($h = 1; $h<=$countforh; $h++) 
{ 
$sql="SELECT * FROM tbl_process WHERE (sr_no = '".$h."' AND com_status = '0')"; 
//Con_status = 0 is for the file which is not encrypted. 
$result = mysqli_query($con,$sql); 
$row = mysqli_fetch_array($result); 
if (is_null($row['pfile_path'])) 
{ 
continue; //if Con_status = 1 
} 

$sql="SELECT * FROM tbl_process WHERE (sr_no = '".$h."' AND com_status = '0')"; 
$result = mysqli_query($con,$sql); 
while($row = mysqli_fetch_array($result)) 
{ 
$_SESSION['filepath'] = $row['pfile_path']; 
$_SESSION['upload_tbl_sr'] = $row['upload_sr_no']; 
} 

ここで暗号化プロセスを開始します。

+0

このような目的のために、メッセージキューまたはワーカーサービスがたくさんあります。これをチェックしてください:http://gearman.org/ – num8er

答えて

1

セッションファイルまたはシリアライズされたファイルを使用して、ファイルをマークまたはアップロードできます。

PHPがシステムにファイルをインポートしたら、あなたは、ファイルまたはセッション

//File serialized, to First file 
if($_FILES['file']['error'] != 0){ //Checks for error while importing file 
    if (!file_exists($tmpF)) { 
     $count = 1; 
     $queue[] = ['id'=>$count,'nameFile'=>$_FILES['file']['name'],'status'=>0]; 
     $tmpF = sys_get_temp_dir().'/reportUpload.txt'; 
     $tmp = fopen($tmpF,'w'); 
     fwrite($tmp, serialize($queue)); 
     fclose($tmp); 
    }else{ 
     //For the second file on. 
     $tmpF = sys_get_temp_dir().'/reportUpload.txt'; 
     $file = fopen($tmpF,'r'); 
     $queue = unserialize(fgets($file)); 
     fclose($file); 
     $last = count($queue); 
     $count = $queue[$last]['id']+1; 
     $queue[] = ['id'=>$count,'nameFile'=>$_FILES['file']['name'],'status'=>0]; 
     $tmp = fopen($tmpF,'w'); 
     fwrite($tmp, serialize($queue)); 
     fclose($tmp); 
    } 
} 


//Starting Encryption 
$tmpU = sys_get_temp_dir().'/reportUploadExecution.txt'; 
if(!file_exists($tmpU)){ 
    $tmpF = sys_get_temp_dir().'/reportUpload.txt'; 
    $file = fopen($tmpF,'r'); 
    $queue = unserialize(fgets($file)); 
    $line = 0; 
    while(!feof($queue)){ 

     if($queue[$line]['status']==FALSE){ 
      //Starting Encryption 
      $tmpU = sys_get_temp_dir().'/reportUploadExecution.txt'; 
      $execution = ['id'=>$line,'nameFile'=>$queue[$line]['nameFile']] 
      $tmp1 = fopen($tmpU,'w'); 
      fwrite($tmp1, serialize($execution)); 
      fclose($tmp1); 


      // Your code here 


      // If encryption ended successfully set line "Status" = 1 
      unlink($tmpU); 
      $line++; 
     } 

    } 
    fclose($file); 
} 

の記録を開始することができますそれはあなたのコードの一部を投稿することができた場合、それはより良いあなたを助けるでしょう、ただアイデアです。

+0

サンプルコードを掲載しました。 – Harinarayan

+0

あなたは、暗号化の前にアップロードの開始とPHPのやり取りの一部をしていますか? –

+0

はい、私たちは2つのPHPページを持っています。最初にファイルをアップロードしてデータベースに保存し、その後に2番目のPHPページを$ command = "nohup/usr/bin/php backend.php" .escapeshellarg($ ($ arg1)。 ">。/ dev/null 2>​​ $ status = shell_exec($ command);この2番目のページでは、暗号化のプロセスが開始されます。 – Harinarayan

関連する問題