как взаимодействовать с уже запущенным скриптом php cli из скрипта php cgi - PullRequest
0 голосов
/ 12 мая 2019

Я сделал скрипт php cli, работающий в цикле.Я запускаю его из терминала сервера (Windows).Этот сервер также функционирует как веб-сервер php (xampp).

Сценарий php cli работает с аппаратным вводом-выводом (отвечает и передает логику плате микроконтроллера через последовательный порт).Который всегда работает.

И что я пытаюсь сделать, так это создать веб-приложение (php cgi) для управления этим скриптом cli.как отправка какой-то команды, чтобы заставить его что-то делать.

То, что я пробовал

Я пытался использовать своего рода временный файл json.Какое содержимое генерируется сценарием cgi.

Затем сценарий cli читает этот файл в каждом цикле.И если в json есть изменение (временная метка), сценарий использует данные внутри json, чтобы сделать что-то соответственно.А затем сохраните эту временную метку, чтобы сравнить ее с json для следующего цикла.

Но это вызывает огромную нагрузку на сервер, и сценарий cli становится намного медленнее.Что влияет на отзывчивость микроконтроллера.

цикл php cli выглядит примерно так:

<?php
$lastTimestamp=0;
while(true){
    //read json file
    $json=json_decode(file_get_contents("temp.json"));
    if($lastTimestamp < $json->stamp){
        //do something with $json->data
        ...
        //update $lastTimestamp
        $lastTimestamp = $json->stamp;
    }

    //rest of microcontroller logic here
    ...
}

, а файл temp.json - что-то вроде

{
  "stamp": 1557653475,
  "data": {
    "nd_a": 1,
    "nd_b": 1,
    "nd_c": 0
  }
}

поэтому вопрос заключается в том, как взаимодействовать с уже запущенным скриптом php cli из скрипта cgi, не используя вышеуказанные методы?ожидая лучшего способа, который не влияет на нагрузку и производительность сервера.

Редактировать: я также пытался использовать базу данных вместо файла json, но производительность все еще не очень хорошая.

1 Ответ

0 голосов
/ 12 мая 2019

Этот способ неэффективен. Самый простой способ - создать задание cron, которое выполняет сценарий cli. Если вы используете систему Linux, вот как вы настраиваете cron (на Ubunutu) https://help.ubuntu.com/community/CronHowto

Затем в вашем скрипте cli вы удаляете цикл, и задание будет читать temp.json (который будет выполняться при каждом запуске задания) и сравнивать обе отметки времени.

Теперь для хранения $ lastTimestamp я бы предложил создать текстовый файл рядом с вашим сценарием cli и сохранить значение $ lastTimestamp в этом файле. Тогда, только если есть разница между отметкой времени, полученной из json, и отметкой времени в текстовом файле, вы перезаписываете текстовый файл новой отметкой времени.

Вы можете использовать file_put_contents или fopen / fwrite для записи в файл.

Итак, ваш скрипт будет выглядеть следующим образом

<?php
$lastTimestamp=0;
$lastTimeStampFilePath = "lastTimeStampFile.txt";
//read text file
$lastTimestamp=file_get_contents($lastTimeStampFilePath);

    //read json file
    $json=json_decode(file_get_contents("temp.json"));
    if($lastTimestamp < $json->stamp){
        //do something with $json->data
        ...
        //update $lastTimestamp
        file_put_contents($lastTimeStampFilePath, $json->stamp);
    }

    //rest of microcontroller logic here

Возможно, настроить работу так, чтобы она выполнялась каждые 2 или 5 минут, в зависимости от ваших требований.

...