2016-05-12 1 views
2

Я также установил удлинитель механизма передач и инструмент командной строки. Я попытался изменить строку с помощью ретранслятора из простого файла php.Как запустить команды exec()/linux с использованием расширения gearman от приложения cakephp?

Example: 
$gmclient= new GearmanClient(); 
$gmclient->addServer(); 
$result = $gmclient->doNormal("reverse", "Test the reverse string"); 
echo "Success: $result\n"; 
output: 
Success: gnirts esrever eht tseT 

Точно так же я попытался запустить EXEC («Ls -l»), я могу выполнить, используя простые PHP файлы из CakePHP приложения из каталога Webroot. filepath: cakephp/app/webroot/worker.php, cakephp/app/webroot/client.php.

worker.php 

<?php 
$worker= new GearmanWorker(); 
$worker->addServer(); 
$worker->addFunction("exec", "executeScript"); 
while ($worker->work()); 
function executeScript($job) 
{ 
    $param = $job->workload(); 
    $t = exec($param); 
    return $t; 
} 
?> 

client.php 

<?php 
$client= new GearmanClient(); 
$client->addServer(); 
$cmd = 'ls -l'; 
print $client->do("exec", $cmd); 
?> 

Как реализовать тот же тип исполнения с использованием View, Controller от cakephp? Рабочий процесс: отправьте данные с View на контроллер с помощью ajax-метода и выполните «exec() от gearman», отправьте вывод обратно в View как ответ ajax POST methodhod.

ответ

0

Ваш рабочий.php должен быть уже запущен на сервере, чтобы это работало. Для тестирования откройте новое окно терминала на сервере, на котором вы хотите запустить work.php. Запустите работника: php worker.php в командной строке. (На рабочем сервере вы можете посмотреть на supervisor, чтобы запустить своего рабочего без терминала.)

Код в client.php будет идти в вашем контроллере, но сохранить результат в переменной вместо оператора print ,

Тот факт, что это было бы от вызова AJAX, не имеет значения, он будет работать так же, как и обычная веб-страница. Когда контроллер выполняет, клиентский код передатчика получит ответ от рабочего, и вы можете вывести результат в представление.

+0

Kris @ Спасибо за ответ. Но мне нужны некоторые данные для обработки кода client.php из представления в контроллер. Пример: Пользователь будет загружать данные и использовать данные ajax post для функции контроллера и запускать код client.php. – Dollyh

2

Почему вы используете exec?! Это создает огромный риск для безопасности. Вместо этого используйте DirectoryIterator.

Ваш клиентский код должен быть частью контроллера.

<?php 
class UploadController extends AppController 
{ 
    public function directoryList() 
    { 
     $directory = ''; 
     // Get data 
     if (!empty($this->data['directory']) && is_string($this->data['directory'])) 
     { 
      $directory = $this->data['directory']; 
     } 
     $client= new GearmanClient(); 
     $client->addServer("localhost",4730); // Important!!! 

     $result = $client->do("fileList", serialize($data)); 

     return $result; 
    } 
} 

Тогда из вида используйте requestAction.

$uploads = $this->requestAction(
     array('controller' => 'upload', 'action' => 'directoryList'), 
     array('return') 
    ); 

работник может выглядеть следующим образом:

<?php 
$worker= new GearmanWorker(); 
$worker->addServer("localhost",4730); // Important!!! 
$worker->addFunction("fileList", "getFileList"); 
while ($worker->work()); 

// From Art of Web 
// http://www.the-art-of-web.com/php/directory-list-spl/ 
function getFileList($dir) 
{ 
    // array to hold return value 
    $retval = array(); 
    $dir = $job->workload(); 
    // add trailing slash if missing 
    if(substr($dir, -1) != "/") $dir .= "/"; 

    // open directory for reading 
    $d = new DirectoryIterator($dir) or die("getFileList: Failed opening directory $dir for reading"); 
    foreach($d as $fileinfo) { 
    // skip hidden files 
    if($fileinfo->isDot()) continue; 
    $retval[] = array(
     'name' => "{$dir}{$fileinfo}", 
     'type' => ($fileinfo->getType() == "dir") ? 
      "dir" : mime_content_type($fileinfo->getRealPath()), 
     'size' => $fileinfo->getSize(), 
     'lastmod' => $fileinfo->getMTime() 
     ); 
    } 

    return $retval; 
} 

Это псевдо-код. Не используйте его в производстве !!! См. Gearman documentation для более предварительной настройки рабочего места.

Чтобы эффективно использовать распределение нагрузки, сервер Gearman не должен быть на локальном хосте, конечно.

+0

Goran @ Я использую exec для запуска python, для запуска этого мне нужна пользовательская информация о загруженных данных. Поэтому я использую вызов ajax для отправки и запуска python и отправки ответа на View. Как реализовать механизм для этого рабочего процесса? Есть ли другой лучший способ. – Dollyh

+0

Я думаю, что это должен быть другой вопрос. Вы вообще не упоминали Python. Ваш вопрос помечен _shell_. В любом случае, используйте [Python worker] (https://pypi.python.org/pypi/gearman/) и сразу вызовите команды Python. Все остальное остается таким же. –

Смежные вопросы