Я нуб в php, я более специализированный с ++.
Там мой вопрос.
Мне нужно реализовать такую последовательность:
Первый процесс выполняет некоторые вычисления, хранит их в БД (или файле)
Второй процесс отвечает на запросы пользователя и передает результаты последних вычислений (сохраняется 1-м процессом).
Какие лучшие практики для этого?
Я предполагаю что-то вроде этого:
if (!calculatorProcess.running())
{
calculatorProcess.run([]{
// do something like this
while (1) {
performCalculations();
storeSomewhere();
sleep(1);
}
}
}
getLastCalculationResults();
sendResponce();
заранее спасибо
В целом, вы должны рассматривать PHP как язык сценариев. То же, что сценарий bash в Linux или сценарий Power Shell в Windows. Если вам нужно обрабатывать данные через регулярные промежутки времени, вы можете запланировать выполнение сценария process.php через равные промежутки времени для обработки данных или выполнения сценарием, который отправляет данные. query.php должен возвращать обработанные данные из БД, когда пользователи запрашивают данные. Таким образом, вам не нужны два потока или процесса, а два отдельных файла, которые будут запускаться вашим сервером (при доступе пользователей) или PHP в командной строке (при запуске в качестве запланированной задачи). Надеюсь, я правильно понял ваш вопрос, и это отвечает на ваш вопрос.
Как бы то ни было, вы не должны разрабатывать PHP-приложения таким образом. Теоретически он должен быть полностью синхронным, поскольку он должен обрабатывать HTTP-запросы, которые сами по себе полностью синхронны.
В вашем примере, если задача 1 — это длительный процесс, вам в конечном итоге понадобится задача 2, чтобы поспать какое-то время или опросить все, что контролирует задачу 1, чтобы увидеть, завершена ли она. При этом вы рискуете истечь время запроса HTTP, если не отвечаете. Если вам нужно сделать это, лучше всего сделать весь бизнес в одном процессе PHP.
Лучший способ (но не единственный способ) справиться с этим, предполагая, что задача 1 является достаточно длительным процессом, который, как заметил бы пользователь, может сделать что-то вроде этого:
//PHP - longrunningprocess.php
$jobId = generateJobId();
//Actually launch the long-running process. There are alternatives to exec, such Icicle:
//https://github.com/icicleio/icicle
exec('/path/to/long_running_script.php arg1 arg2 arg3');
echo '{ "jobId":'.$jobId.'}';
//end
//PHP - longrunningprocessresult.php
$jobId $_GET['jobId'];
var result = new LongRunningProcessResult();
var jobStatus = getJobStatus();
if(jobStatus.complete != true)
{
result.complete = true;
result.property1 = jobStatus.property1;
//...
}
else
{
result.complete = false;
}
echo json_encode(result);
А потом на стороне клиента, что-то вроде этого:
function handleJobSuccess(results)
{
//Do whatever you do with the results
}
function checkForCompletion(jobId)
{
setTimeout(function() {
$.ajax("longrunningprocessresult.php?jobId=" + jobId, {success: function(args){
if(args.success)
{
handleJobSuccess(args);
}
else
{
checkForCompletion(jobId);
}
}
});
}, 5000);
}
function beginLongRunningProcess()
{
showWorkingThrobber();
$.ajax('longrunningprocess.php', { success: function(args){
var jobId = args.jobId;
checkForCompletion(jobId);
}});
}
Важным моментом для этого является то, что вы не хотите отправлять запрос на сервер для длительного процесса, который просто связывает браузер во время его работы. Вам необходимо реализовать пользовательский интерфейс, который по крайней мере подразумевает для пользователя, что процесс работает, а затем обрабатывает результат асинхронно.