Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Не работает system ()


Автор: SergeyMitrofanov 1.9.2007, 11:57

      Очень прошу мне помочь в решнии важного вопроса - не могу научиться запускать из PHP-кода функцию system ().

      Есть исполняемый файл -  ABC.exe, получен из кода, написанного на С, в результате работы ABC.exe появляется текстовый файл, который пишется в ту же директорию, в которой находится ABC.exe, больше эта DOS-программа ничего не делает, ничего в потоки не выдает.

      В коде PHP вот такая строка

         system ("ABC.exe");
      
      не работает. :-(

      Работаю под последним Денвером for Windows XP.


Автор: gta4kv 1.9.2007, 12:15
Помойму путь надо указывать полностью, посмотрите там примеры внизу : http://ru.php.net/system

Автор: SergeyMitrofanov 1.9.2007, 13:37
Цитата(gta4kv @ 1.9.2007,  12:15)
, Помойму путь надо указывать полностью, посмотрите там примеры внизу : ]http://ru.php.net/system[/URL]

  


   К сожалению, полный путь не помогает

   Код на PHP - файл  first.php -  у меня такой:

   <?php
         $dir = opendir ("/home/test.ru/www");
         chdir ("/home/test.ru/www");

          system ("abc.exe");

           //exec (escapeshellcmd ("dos_htm d_long2.cpp"));
?>

Код abc.exe:  -  Compilier:   ВС++ 3.1   for  DOS

        # include <stdio.h>
        # include <conio.h>

        int main ()
        {
          FILE  * F;

          F  = fopen ("abc.txt", "wb");
          fprintf (F, "12345");

          fclose (F);

          return 0;
        }

Работаю на Denwer - Apache 1.3.33 Win32  и  PHP 5.1.6

В чем моя ошибка?
Что делаю не так?

Файл abc.exe находится в C:\WebServers\home\test.ru\www

Help!

Автор: BuShaRt 2.9.2007, 12:14
SergeyMitrofanov, 
Файл точно лежит в той же директорие что и скрипт и он точно может выполнять запрос, просто при обращение к нему, а не при манипуляциях с ним?

Автор: SergeyMitrofanov 2.9.2007, 15:24
Цитата(BuShaRt @ 2.9.2007,  12:14)
SergeyMitrofanov, 
Файл точно лежит в той же директорие что и скрипт и он точно может выполнять запрос, просто при обращение к нему, а не при манипуляциях с ним?


  -- да, файл с кодом на PHP и файл abc.exe лежат в одной и той же директории
     /home/test.ru/www

     Если просто зайти в эту директорию и запустить вручную файл abc.exe, то он сработает
     и создаст файл  abc.txt

     Denwer поставлен с нуля со всеми стандартными установками *.ini
     Windows XP лицензионная тоже установлена с нуля.

     Работает большой по объему код на PHP безукоризненно, кроме вызова system ().
     Это единствеенное, что  не работает.

     

Автор: sTa1kEr 2.9.2007, 17:01
SergeyMitrofanov, попробуйте ради эксперимента выполнить следующий код
Код

$descriptors = array(
   0 => array('pipe', 'r'),
   1 => array('pipe', 'w'),
   2 => array('pipe', 'w'));

$res = proc_open("abc.exe", $descriptors, $pipes);
if (is_resource($res))
{
   echo stream_get_contents($pipes[2]);
   fclose($pipes[0]);
   fclose($pipes[1]);
   fclose($pipes[2]);
   proc_close($res);
}

Это аналогично system("abc.exe"), но все что пришло в STDERR будет выведено на экран.

Автор: vdim 16.7.2008, 20:24
Цитата

все что пришло в STDERR будет выведено на экран

А можно ли брать все что пришло в STDERR не после того как программа отработала, а сразу же как случился вывод?
Т.е. моя программа на си выводит в стандарный поток много инфы, работает долго. Необходимо отображать все что вывела сразу же юзеру на страничку. Можно ли такое?

Автор: Mal Hack 16.7.2008, 20:49
SergeyMitrofanov, проблема в том, что вы используйте system, и если бы вы обратили внимание на ссылку, которую вам привел gta4kv, 
Цитата

system() is just like the C version of the function in that it executes the given command and outputs the result. 
 The system() call also tries to automatically flush the web server's output buffer after each line of output if PHP is running as a server module. 
 If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.

Исполняемый файл - не одно и тоже, что команда.
Потом, вы же ничегов exe файлы в STDOUT не посылаете, следовательно после выполнения system (при определенных условиях - сработает) вы ничего не сможете лицезреть.
Вам надо воспользоваться exec, при этом указать полный путь, не забыв при этом, что в винде слеши используются - обратные, которые еще надо проэкранировать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)