Я написал очень сложный, очень хакерский скрипт PHP-cli, который получает и анализирует JSON с изменяемой структурой, глубиной и содержанием.По этой причине в то время я обнаружил, что проще всего выполнить синтаксический анализ с использованием PHP shell_exec()
и cat | jq | grep
.
Иногда, редко, при определенных входных данных он выдает мне сообщение Error: writing output failed: Broken pipe
, которое является последним сообщением, которое я вижу в выводе cli перед тем, как скрипт умирает.Тем не менее, даже когда это происходит, данные по-прежнему анализируются правильно, несмотря на все те незначительные преимущества, которые они мне приносят.
Я выделил проблемный фрагмент кода следующим образом:
$jq1='cat '.$randfile.' | jq \'.\' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}"';
$jq1=trim(shell_exec($jq1));
И попытался отладить его, увидев, что он выполняет.Первая строка - это аргумент shell_exec, отображаемый перед выполнением, вторая строка - результат shell_exec.
Command: cat 5ca15f21.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: standalone
Command: cat 5ca59379.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: season
Error: writing output failed: Broken pipe
Command: cat 5ca7d271.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: extended
Command: cat 5ca7d7a8.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: season
(я видел ошибку моих ленивых путей ия буду переписывать весь этот раздел, но тогда я был молодым, неопытным и нетерпеливым. Я все еще хотел бы понять, что и почему не так.)
Что заставило бы это сделать это?иногда?На входе всегда печатается JSON JSON с разной структурой.
Даже если получено сообщение о разрыве канала, необходимое значение все равно анализируется и сохраняется в переменной.Что заставляет его умереть тогда?Я хотел бы знать на будущее, есть ли способ заставить PHP игнорировать [нефатальную] ошибку и продолжать выполнять.
Почему команда оболочки, которая создает сломанный каналсообщение об ошибке в shell_exec ведет себя не иначе, когда вызывается вручную в bash?Где сломанная труба и что делает ее такой сломанной?