レシーバー (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;
}