0

レシーバー (Pager、Arduino、マイクロコントローラー) に配信する必要があるキューリスト (Zend Framework PHP で作成され、MySQL に保存されます) があります。

ただし、レシーバーの電源がオフになっている (電源障害または電源に接続されていない) か、ネットワークがない (wifi が利用できない、またはケーブルが抜かれている) 可能性があります。

後でその(デバイス)が利用可能/オンラインになると。PHP はサーバーからデバイスに送信する必要があります (デバイスはクロールを実行しません。これは、デバイスが TCP プロトコルのサーバー モードとしてリッスン ポートを 1 つしか持っていないためです)。

そのため、PHP から BASH スクリプトを作成し、ループを使用して新しいプロセスとして実行する必要があります。どうやってそれをしますか?ここに私が意味する大まかなサンプルがあります:

ジョブとしての新しいプロセス:

$ cat /var/tmp/job1.sh
#!/bin/bash
while :
do
  # by triggering this it will send a TCP command to the device for downloading the new job

  #curl "http://myphpserver/controller/action?valuesfromPHP1=1&valuesfromPHP2=2" &
  curl "http://myphpserver/controller/action?valuesfromPHP$1=1&valuesfromPHP2=$2" &
  sleep 1
done

シェル関数を使用してコマンド ライン引数を正確に送信し、スクリプトの実行後 1 秒以内に PHP がフリーズせずに解放されるように、PHP がスクリプトの終了を待たないようにする方法を PHP からタスクに割り当てます。

$ php -R "shell_exec('/var/tmp/job1.sh value1 value2');"

PHPでそれをどのように行いますか?

編集:

ステップ 1: ジョブを開始する

  $l  = strtolower($this->data->language);
  $d1 = strtolower($rec->department1);
  $d2 = strtolower($rec->department2);
  $d3 = strtolower($rec->department3);
  $d4 = strtolower($rec->department4);
  shell_exec("/var/tmp/job1.sh {$l} {$d1} {$d2} {$d3} {$d4}");

ステップ 2: BASH から PHP へのトリガー

  public function triggerdeviceAction() {
    $d1  = $_GET['department1'];
    $d2  = $_GET['department2'];
    $d3  = $_GET['department3'];
    $d4  = $_GET['department4'];
    $l   = $_GET['language'];

    $sql = "select *from sh_av_profile where
              `group` = 'agent' and
              status='free' and
              operator <> '' and 
              (
                department1=LOWER('{$rec->department1}') OR
                department2=LOWER('{$rec->department2}') OR
                department3=LOWER('{$rec->department3}') OR
                department4=LOWER('{$rec->department4}')                    
              )";
    $tmpres = $this->db->fetchAll($sql);      

    if (count($tmpres) > 0) {      
      foreach ($tmpres as $workstations) {
        $workstations['department1'] = strtolower($workstations['department1']);
        $workstations['department2'] = strtolower($workstations['department2']);
        $workstations['department3'] = strtolower($workstations['department3']);
        $workstations['department4'] = strtolower($workstations['department4']);

        $sql = "select *from sh_av_users where
                  username = LOWER('{$workstations['operator']}') and
                  status='online' and
                  (
                    language1=LOWER('{$l}') OR
                    language2=LOWER('{$l}') OR
                    language3=LOWER('{$l}')
                  ) and
                  department in (LOWER('{$workstations['department1']}'), 
                                 LOWER('{$workstations['department2']}'), 
                                 LOWER('{$workstations['department3']}'),
                                 LOWER('{$workstations['department4']}') 
                                )
                limit 1";
        $operatorFind = $this->db->fetchAll($sql);            
        if(count($operatorFind) > 0) {      
          try {
            $reject = new Application_Model_Device($workstations['ip'], 58888);
            $reject->sendKioskNoWait("calling");
          } catch(Exception $e) {

          }
          break;
        }
      }

    }

    echo "OK";
    exit;
  }
4

1 に答える 1

0

ステップ1:

cat > /var/tmp/job1.sh <<\EOF
    #!/bin/bash
    i=0  
    while :
    do
      (( i++ ))
      a=$(curl -s --connect-timeout 1 'http://localhost/a/triggerdevice?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7' | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["result"]')

      if [ a -eq "success"]; then
        echo "[OK]: $i"
        exit
      else
        echo "[FAIL]: $i"
      fi

      sleep 1

    done

EOF
chmod +x /var/tmp/job1.sh

ステップ 2: shell_exec を使用して php から呼び出す

shell_exec('/var/tmp/job1.sh tech dev root test NL 123 USER1');
于 2013-11-09T04:31:56.163 に答える