안녕하세요. 저는 최선의 실습과 대기열 처리 및 이미지 조작에 관한 간단한 도움말과 관련하여 빠른 질문을드립니다.대기열 처리 및 이미지 처리
임 현재 사용자가 한 번에 10 개가 넘는 파일을 업로드 할 수있는 웹 사이트에서 작업 중입니다. 실제로는 한 번만 처리되거나 최대 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에서 데이터를 가져 와서 작업 할 수있는 더 좋은 방법이 있습니다. Ive는 틈새를 빠져 나가는 것을 막기 위해 if 문을 여러 개 넣었습니다.
다른 사람들의 생각을 듣기에 위대합니다. 아마 내가 첫 번째 루프에 존재하지 않는 파일의 배열을 저장할 수 있고 그 후에 다시 시도해 보겠습니다. 이미지가 존재하기 전에 실행되는 코드의 경우 일 수도 있습니다.
모든 도움을 주시면 감사하겠습니다.
감사
안녕하세요. Dustin 덕분에 SQS로 보였지만 queueing에 iron.io를 사용하기로 결정했습니다. 서버에서 deamons를 실행해야한다는 의미로 Laravel 4와 잘 통합되어 있기 때문에 단순히 보호 된 URL은 이미지 가져 오기 프로세스를 시작합니다. ive는 file_exists 확인을 추가했으며 위에서 언급 한 문제 중 일부를 중단 한 것으로 보입니다. 그런 식으로 가져 오기를 추적하는 것이 의미가 있으므로 언급 한 것처럼 데이터베이스 설정을 구현할 것입니다. thanks again –
S3FS를 시도하고 S3 버킷을 서버의 mnt 지점에 마운트 한 다음 해당 마운트 지점에 대한 심볼릭 링크를 만들 수 있습니다. 내 시스템에서/mnt/s3/bucketname에 대한 symlink/public/uploads를 사용하고 싶습니다. 이것은 또한 S3에서 파일을 다운로드하고 처리 한 다음 다시 업로드해야하는 측면에서 도움이 될 수 있습니다. S3 버킷에서 모든 작업을 수행 할 수 있으며 버킷에 임시, 소형, 중형, 대형을위한 하위 '폴더'를 만듭니다. 이 기능의 이점은 실제 웹 사이트를 통해 이미지에 링크 할 때 s3 cdn 링크를 계속 사용할 수 있다는 것입니다. –