php exec выводится - PullRequest
       2

php exec выводится

4 голосов
/ 24 августа 2010

У меня опять другая проблема с использованием exec в php
моя ОС - suse linux, и я использую php 5.1.2

Каким-то образом мой вывод обрезается при использовании exec ()

в Linux

~ -> ps -ef | grep java
root      3548     1  0 Aug05 ?        00:00:01 /usr/java/jdk1.5.0_13//bin/java -server -Djava.awt.headless=true -Xms512m -Xmx512m -XX:NewSize=224m -XX:MaxNewSize=256m -XX:SurvivorRatio=8 -XX:+UseParallelGC -jar /jfe-server.jar start
psinl    14811     1  0 09:12 ?        00:00:01 /usr/java/jdk1.5.0_13//bin/java -server -Djava.awt.headless=true -Xms512m -Xmx512m -XX:NewSize=224m -XX:MaxNewSize=256m -XX:SurvivorRatio=8 -XX:+UseParallelGC -jar jfe-server.jar start
psinl    18164 18080  0 16:20 pts/1    00:00:00 grep java

, но при выводе в Интернет через

<code><div>Checking whether JFEServer has been started</div>
<div><pre><?php exec('ps -ef | grep java',$output,$result);
print_r($output); ?>

И мой вывод в Интернете

Checking whether JFEServer has been started

Array
(
    [0] => root      3548     1  0 Aug05 ?        00:00:01 /usr/java/jdk1.5.0_13//bin/java
    [1] => psinl    14811     1  0 09:13 ?        00:00:01 /usr/java/jdk1.5.0_13//bin/java
    [2] => psinl    18069 14271  0 16:20 ?        00:00:00 sh -c ps -ef | grep java
    [3] => psinl    18071 18069  0 16:20 ?        00:00:00 grep java
)

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

Ответы [ 4 ]

2 голосов
/ 03 июня 2011

Это потому, что PHP просто не может выделить достаточно большой буфер для использования с exec.Лучше всего добавить шаг между ними: перенаправить вывод во временный файл в вашем exec() вызове

, например: exec('ps -ef | grep java > /tmp/mytmpfilename.txt')

... и затем вывести его наэкран с вызовом file_get_contents()

пример: var_dump(file_get_contents('/tmp/mytmpfilename.txt'));

edit: в качестве альтернативы, вы можете использовать file (), если есть вывод LOT данных, например, несколько тысяч строк.

1 голос
/ 31 октября 2013

Мне пришлось добавить флаг -w, чтобы удвоить вывод ps на Centos 6.2. Конечно, это иногда необходимо, особенно в сеансе, запускаемом из сценария.

В сеансе TTY ps не будет обрезать вывод, но в других обстоятельствах (в зависимости от переменной TERM это произойдет. Вы также можете явно установить неограниченное значение, добавив -ww.

ps man-страницы были для меня ключом к этому.

1 голос
/ 24 августа 2010

Вы можете использовать passthru, который передает вывод команды непосредственно в браузер клиента.

<code><div>Checking whether JFEServer has been started</div>
<div><pre><?php passthru( 'ps -ef | grep java', $result ); ?>

Если это не поможет, вам следует изучить документацию ps , если она проверяет стандартный тип выходного терминала (например, файл / канал / терминал). Если это так, он может обрезать его до некоторой ширины по умолчанию, если он не может определить фактическую ширину терминала. На моем сервере, основанном на Debian, это так. Правильная команда на моей машине:

<code><div>Checking whether JFEServer has been started</div>
<div><pre><?php passthru( 'ps -efww | grep java', $result ); ?>

0 голосов
/ 24 августа 2010

php не обрезал ваш вывод, браузер сделал.проверьте исходный вывод, щелкнув правой кнопкой мыши -> Просмотреть источник страницы в браузере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...