2012-05-16 3 views
0

Мне нужно запустить сервер OpenOffice в фоновом режиме (если это не instanciate), то сделать конвертацию файлов с JODConverter.
Сценарий выглядит следующим образом:Базовый фоновый процесс, инициируемый PHP, не работает

  • Пользователь вводит * .html файл по форме.
  • Я получаю файл переменной $ _FILES в скрипте PHP, соответствующем действию формы
  • Я запускаю скрипт bash с помощью shell_exec и передаю ему путь temp, чтобы получить доступ к файлу в моем сценарии bash, затем сделать Перекодировка

Это PHP код:

 $fichier = $_FILES['html_file']; 
     if($fichier) { 
      if(is_uploaded_file($fichier['tmp_name'])) { 

       if(move_uploaded_file($fichier['tmp_name'],"/var/www/test/doc/".$fichier['name'])) { 
        $output = shell_exec("./converter {$fichier['name']}"); 
        echo $output; 
       } 
      } 
     } 

сценарий "преобразователь" код:

#!/bin/bash 
fichier=$1 
pid=$$ 

echo RUNNING sOFFICE : 

SERVICE=soffice 
if P=$(pgrep $SERVICE) 
then 
    echo sOFFICE IS ALREADY RUNNING 
else 
    echo sOFFICE WILL BE START WAIT 5s PLEASE 
    soffice --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard & 
    sleep 5 
fi 

echo CONVERSION START 
java -jar ./jodconverter/lib/jodconverter-cli-2.2.2.jar ./$1 ./$1.odt 
echo CONVERSION END 

Моя проблема заключается в первой части сценария bash, когда я пытаюсь запустить сервер sOFFICE в фоновом режиме, эта команда блокирует окончательное выполнение скрипта, даже с использованием &.
Я пытался запустить этот скрипт с помощью терминала, и он отлично работает.
Так что я думаю, проблема связана с выполнением php скрипта bash. Есть идея ?

EDIT:
Решение найдено благодаря ответ Джим Рубинштейн:

перенаправлять стандартный вывод и стандартная ошибка ручьи

: Заменить

soffice --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard & 

по

soffice --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard > /dev/null 2> /dev/null & 

ответ

4

Эта проблема обычно решается с помощью добавления & в конце команды; но похоже, что вам также необходимо перенаправить стандартные и стандартные потоки ошибок. Я нашел ответы на тот же вопрос о переполнении стека здесь:

php execute a background process

Why this process is not running in background?