sorting — php, exec, команда sort, выходной файл «появляется» усеченным, но входной файл не полностью прочитан до EOF

Когда я использую php для

exec('sort /var/www/website/file_in.txt -o /var/www/website/file_out.txt');

файл, который выводится из команды сортировки, обрезается

размер входного файла = 2,442,541

размер выходного файла = 1 148 881


Я также заметил, что при использовании функции php filesize (file_in.txt) возвращаемое значение = 1 148 881, а не правильный размер, как показано в терминальной сессии. Я вызывал clearstatcache () до вызова filesize ().

Интересно, что filesize сообщает размер file_in как то же значение, до которого усечен file_out.

Я использую 64-битную версию PHP _x86_64 для Linux, поэтому я подумал, что это устраняет проблему ограничения 32-битного размера для файлов gt 2 МБ.


Когда я запускаю команду сортировки в сеансе терминала как пользовательские www-данные, выходной файл имеет тот же размер, что и входной файл, без усечения.


Я попытался написать сценарий оболочки для вызова из exec, надеясь, что он обойдет возможное ограничение php-буфера, но у него тот же усеченный выходной файл.


У меня есть TOP, работающий в отдельном терминале для наблюдения за использованием процессора и памяти, но поскольку coammdn при запуске в терминале не усекает вывод, это кажется проблемой PHP.


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

Спасибо


Дополнительная информация: я понял, что выходной файл не усекается, а входной файл не полностью читается до EOF.

0

Решение

похоже, это было вызвано нехваткой доступной памяти в этот момент выполнения скрипта php.

в ходе пробных тестов я увеличил параметр команды SORT —buffer-size = 4K, начиная с 4K, 5K, 10K, 40K, но ничего не получилось.

Я смотрел TOP, чтобы увидеть, как сообщалось об использовании CPU% памяти.

Я не думал, что это была проблема, поэтому я не описал ее в своем первоначальном вопросе, но перед этим шагом вызова SORT th EXEC я вызывал pdftotext thru EXEC. Когда этот процесс выполнялся, загрузка ЦП сервера увеличилась до 98%. Память, вероятно, также резко возросла, но частота обновления TOP не отражала ее.

Я предположил, что я мог бы добавить sleep(5) перед вызовом команды SORT приостановить выполнение сценария PHP, давая процессору и памяти всплеск времени, чтобы вернуться в нормальное состояние. Это решило проблему сортировки всего файла ввода и вывода всего его содержимого. Это также решило неправильное filesize() результат.

В производственной среде я увеличу скорость сервера и постараюсь устранить sleep(5) задержка. Я не могу ждать, пока я не достигну уровня запуска «лапша рамен» 🙂

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]