PHP - как обеспечить правильную последовательность выполнения команд - PullRequest
0 голосов
/ 13 марта 2012

Учитывая простой код вроде:

$file = 'hugefile.jpg';
$bckp_file = 'hugeimage-backup.jpg';
// here comes some manipulation on $bckp_file.

Предполагаемая проблема заключается в том, что если файл большой или большой, скажем, в формате jpg, можно подумать, что его копирование займет некоторое время на сервере (я имею в виду даже несколько миллисекунд) - но одна также предположил бы, что выполнение следующей строки будет намного быстрее .. Таким образом, теоретически - я мог бы получить ошибку «нет такого файла или каталога» при попытке манипулировать файлом, который еще не создан - или, что еще хуже, - начать манипулировать файлом TRUNCATED .

Мой вопрос: как я могу убедиться, что $ bckp_file был успешно создан (или в данном случае скопирован) перед следующей строкой, которая им манипулирует?

Какие есть варианты «приостановить», «задержать» выполнение следующей строки до завершения создания / копирования файла?

сейчас я могу думать только о чем-то вроде

if (!copy($file, $bckp_file)) {
    echo "failed to copy $file...\n";
}

, который только предупредит меня, но ничего не решит (так же, как и ошибка php)

или

if (copy($file, $bckp_file)) {
  // move the manipulation to here ..
}

Но это также не так верно - потому что, допустим, копия не была выполнена - я просто выйду из цикла, не достигнув своей цели и без ошибок.

Это вообще проблема или я слишком обдумываю это? Или PHP имеет встроенный механизм для обеспечения этого? Любые рекомендуемые практики? есть мысли по этому поводу? ??

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Какие есть варианты «приостановить», «задержать» выполнение следующей строки до тех пор, пока создание файла / копирование не будет завершено

copy () - синхронная функция, означающая, что код не будет продолжаться после вызова функции copy () до тех пор, пока copy () не завершится полностью или не завершится неудачей.

Другими словами, в этом нет никакой магии.

if (copy(...)) { echo 'success!'; } else { echo 'failure!'; }

Наряду с синхронным вводом-выводом, существует также асинхронный ввод-вывод. Это немного сложно объяснить в технических деталях, но общая идея заключается в том, что он работает в фоновом режиме, и ваш код подключается к нему. Затем, когда происходит значительное событие, фоновое выполнение предупреждает ваш код. Например, если вы собираетесь выполнить асинхронное копирование файла, вы зарегистрируете прослушиватель для копирования, который будет уведомлен, когда будет достигнут прогресс. Таким образом, ваш код может делать другие вещи в то же время, но вы также можете знать, какой прогресс был достигнут в этом файле.

1 голос
/ 13 марта 2012

PHP обрабатывает загрузку файлов, сохраняя весь файл во временном каталоге на сервере перед выполнением любого сценария (так что вы можете использовать $ _FILES с самого начала), и можно с уверенностью предположить, что все функции синхронны - то есть PHP будет ждать выполнения каждой строки, прежде чем перейти к следующей строке.

...