Когда я использую 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.
похоже, это было вызвано нехваткой доступной памяти в этот момент выполнения скрипта 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)
задержка. Я не могу ждать, пока я не достигну уровня запуска «лапша рамен» 🙂
Других решений пока нет …