こんにちは、ベスト プラクティスに関する簡単な質問と、キューイングと画像操作に関するヘルプをお願いします。
私は現在、ユーザーが一度に 10 個を超えるファイルをアップロードできるようにする Web サイトに取り組んでいます。私の経験では、実際には 1 回のアップロードまたは最大 2 ~ 3 回しか処理できませんでした。このサイトでは、ユーザーは好きなだけアップロードしてから、画像操作を実行して、各画像の 3 つのバージョンを異なるサイズで作成します。
私の思考プロセスとこれをどのように実装したかは次のとおりです。
ユーザーがフォームのアップロードに移動し、複数のファイルを選択すると、フォームの自動送信が完了すると、これらはすべてインラインでアップロードされます。アップロードされたファイルは、S3 の一時フォルダーに直接アップロードされます。これは、負荷のあるライブ環境に複数のサーバーがあるためです。それらの前にバランサーがあるので、それらをすべてサーバーにアップロードした場合、キューを起動すると、間違ったサーバーに移動してファイルが見つからない可能性があるのではないかと心配していました。これを行う良い方法があれば素晴らしいでしょう。
フォームが送信されると、基本的にサーバーを呼び出して画像の処理を開始するフォーム送信からのデータを使用して、iron.io のキューに通知を送信します。このコードは以下のとおりです。
public function fire($job, $data)
{
set_time_limit(0);
try {
if(is_array($data)){
foreach ($data['file'] as $x => $file){ //loop through each file uploaded and now save them
if ($this->images->doesMediaExistInTemporaryFolder($file)){
if ($new_file = $this->images->getMediaFromTemporaryS3Folder($file)){
file_put_contents (app_path() . '/storage/bulk-upload/' . $file, (string) $new_file['Body']);
$record_date = false;
if ($data['date'][$x] != 'no-date'){
if ($new_file['ContentType'] == 'image/jpeg') {
$exif_data = @exif_read_data(app_path() . '/storage/bulk-upload/' . $file, 'FILE');
}
if (!empty($exif_data) && @array_key_exists('DateTime', $exif_data)){
$record_date = $exif_data['DateTime'];
} else {
$record_date = $data['date'][$x];
}
}
$created_file = new \Symfony\Component\HttpFoundation\File\UploadedFile(app_path() . '/storage/bulk-upload/' . $file, $file, $new_file['ContentType'] );
$input = array('vehicle_objectId' => $data['vehicle_objectId'], 'type' => $data['type'], 'privacy' => $data['privacy'], 'date' => $record_date);
if (file_exists(app_path() . '/storage/bulk-upload/' . $file)){
if ($record = $this->record_repository->save($input, $created_file)) {
unlink(app_path() . '/storage/bulk-upload/' . $file);
$this->images->deleteMediaFromTemporaryS3(array(array('Key' => $file )));
} else {
$data['filename'] = $file;
\Mail::send('emails.bulk-upload', $data, function($message) {
$message->to('email', 'Daniel Newns')->subject('Bulk upload save issue');
});
}
}
}
}
}
$parse = new \ParseRestClient();
$user = $parse->retrieveCurrentUser( $data['pid']);
if (isset($user->email)) {
$vehicle_url = \URL::route('vehicles.show', $data['vehicle_objectId']);
$body = "<p>Hi " . $user->username . "</p><p>Your records have all been created. View them all as part of your vehicle record <a href='" . $vehicle_url . "'>here</a></p>";
$message = array(
'to' => array(array('email' => $user->email)),
'from_email' => 'xxxxx
'from_name' => 'xxxxx'
);
$template_content = array(array("name" => "share", "content" => $body));
$response = \Email::messages()->sendTemplate('Bulk_Upload', $template_content, $message);
}
}
} catch(\Exception $e){
$message = array(
'to' => array(array('email' => 'email')),
'from_email' => 'email',
'from_name' => 'xxxxxx'
);
$content = '<p>'. $e->getMessage() . '</p>';
$content .= '<p>' . $e->getTraceAsString() . '</p>';
$template_content = array(array("name" => "share", "content" => $content));
$response = \Email::messages()->sendTemplate('Content_Share', $template_content, $message);
}
}
ご覧のとおり、キューから返されたデータをループし、ここからファイルをループします。S3 から画像を取得してローカルに保存し、日付が設定されているかどうかを確認し、それまたは exif を介して作成日を計算します。データ。次に、ファイルを作成し、必要なすべてのサイズ変更を実行する保存機能でレコードを保存します。
私の質問は、ローカルで作成されていないような特定の画像を見つけることができないという例外からメールを時々受け取るので、これを改善する方法について他の誰かが何か提案を持っているかということです.file_put_contest
私が使用する必要があるもの、または S3 からデータを取得して操作するためのより良い方法があります。ギャップなどから物が落ちるのを防ぐために、いくつかのifステートメントを入れました.
ここで私が間違っていた場所と、これを改善するために何ができるかについて、他の人の考えを聞くことができてうれしいです。おそらく、最初のループに存在しないファイルの配列を保存してから、イメージが存在する前にコードが実行されている可能性があると考えていたので、後で再試行できますか?
どんな助けでも大歓迎です。
ありがとう