· 8 years ago · Dec 21, 2017, 07:40 AM
1<form method="POST" id="formx" action="javascript:void(null);" onsubmit="call()">
2<button></button
3</form>
4<div id='text'></div>
5
6<javascript>
7call(){
8 подключает файл 2
9}
10</javascript>
11
12<?php
13for($i=0; $i < 500; $i++){
14$i //поÑтоÑнно передаём Ñообщение о значение переменно $i в поле файла 1 id='text'
15}
16?>
17
18<?php
19
20ob_start();
21
22$html = '';
23
24/* Структура БД
25--
26-- Структура таблицы `tasks`
27--
28
29CREATE TABLE IF NOT EXISTS `tasks` (
30 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Первичный ключ, номер задачи',
31 `lock` int(11) NOT NULL COMMENT 'Флаг блокировки задачи',
32 `input` int(11) NOT NULL COMMENT 'Входные данные задачи',
33 `output` int(11) NOT NULL COMMENT 'Выходные данные задачи',
34 `current` int(11) NOT NULL COMMENT 'Текущие или промежуточные данные задачи',
35 `progress` double NOT NULL COMMENT 'Поле прогреÑÑа задачи, будет полезно Ð´Ð»Ñ Ñложных многоÑтупенчатых задач',
36 PRIMARY KEY (`id`),
37 KEY `lock` (`lock`)
38) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
39*/
40
41/* ПодключаемÑÑ Ðº БД */
42$link = mysqli_connect('localhost', 'root', 'root', 'stackoverflow');
43
44$task_id = isset($_GET['task_id']) ? intval($_GET['task_id']) : NULL;
45$progress = isset($_GET['progress']) && $_GET['progress'] ? true : false;
46if ($task_id) {
47 /* Отображаем Ñтраницу данных по конкретной задаче */
48 $result = mysqli_query($link, "SELECT * FROM `tasks` WHERE `id` = ".mysqli_real_escape_string($link, $task_id)." LIMIT 1;");
49 if ($result && $task = mysqli_fetch_assoc($result)) {
50 if ($progress) {
51 /* ЕÑли был запрошен только прогреÑÑ, возвращаем его */
52 $html .= sprintf('%.1f', $task['progress']);
53 } else {
54 /* Иначе */
55 $html .= '<h3>Задача #'.$task_id.'</h3>
56 <p>ПрогреÑÑ: <span id="progress">'.sprintf('%.1f', $task['progress']).'</span> %</p>
57 ';
58 if (floatval($task['progress']) < 100.0) {
59 /* Также добавлÑем Ñкрипт Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€ÐµÑÑа по AJAX */
60 $html .= '
61 <script src="http://code.jquery.com/jquery-3.2.1.min.js"></script>
62 <script>
63 var updateProgressIntervalId = null;
64 $(function(){
65 updateProgressIntervalId = setInterval(function(){
66 /* ÐÐ½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€ÐµÑÑа на Ñтранице клиента */
67 $.get("index.php", {task_id:'.$task_id.',progress:1},function(data, textStatus, jqXHR){
68 /* Callback Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ результата ответа */
69 if (textStatus == "success" && data) {
70 $("#progress").html(data);
71 if (Number(data) == 100.0) {
72 /* ОÑтанавливаем Ð¾Ð¿Ñ€Ð¾Ñ Ð¿Ñ€Ð¾Ð³Ñ€ÐµÑÑа по задаче */
73 clearInterval(updateProgressIntervalId);
74 }
75 }
76 });
77 }, 200);
78 });
79 </script>
80 ';
81 }
82 }
83 } else {
84 $html .= '<p>Задача #'.$task_id.' не найдена</p>';
85 }
86} else {
87 /* Отображаем Ñтраницу запуÑка задачи */
88 $html .= '<h3>Пример</h3>
89 <form action="" method="post">
90 <input type="submit" name="start" value="ЗапуÑтить новую задачу и запуÑтить процеÑÑ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹">
91 </form>
92 <form action="" method="post">
93 <input type="submit" name="worker" value="ЗапуÑтить процеÑÑ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹">
94 </form>
95 ';
96
97 /* ПроверÑем, а не была ли запущена задача */
98 if (isset($_POST['start'])) {
99 mysqli_query($link, "INSERT INTO `tasks` (`lock`,`input`,`output`,`current`,`progress`) VALUES (0,0,10000,0,0);");
100 $task_id = mysqli_insert_id($link);
101 header('Location: index.php?task_id='.$task_id);
102 }
103
104 if (isset($_POST['start']) || isset($_POST['worker'])) {
105 /* ЗапуÑкаем воркер в фоне. ÐšÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð°Ñ Ñтрока завиÑит от вашей ОС/Ñервера и наÑтроек */
106 exec('/usr/bin/php -f '.__DIR__.'/worker.php > /dev/null 2>&1 &');
107 }
108}
109
110/* ОтключаемÑÑ Ð¾Ñ‚ БД */
111mysqli_close($link);
112
113if ($progress) {
114 print $html;
115} else {
116 print '<html>
117 <head>
118 <title>ru.stackoverflow.com/questions/759003/</title>
119 </head>
120 <body>
121 '.$html.'
122 </body>
123 </html>
124 ';
125}
126
127ob_flush();
128
129?>
130
131<?php
132
133/* ПодключаемÑÑ Ðº БД */
134$link = mysqli_connect('localhost', 'root', 'root', 'stackoverflow');
135
136/* Флаг Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ */
137$need_to_restart = false;
138
139/* Ищем задачи, которые Ñвободны и не завершены */
140$result = mysqli_query($link, "SELECT * FROM `tasks` WHERE `lock` = 0 AND `progress` < 100 LIMIT 1;");
141if ($result && $task = mysqli_fetch_assoc($result)) {
142 /* Блокируем задачу */
143 mysqli_query($link, "UPDATE `tasks` SET `lock` = 1 WHERE `id` = ".mysqli_real_escape_string($link, $task['id']).";");
144
145 /* ВыполнÑем некую работу (+1 к промежуточному Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² данном Ñлучае) */
146 $task['current'] += 1;
147 $task['progress'] = 100.0 * $task['current'] / $task['output'];
148 if ($task['progress'] > 100.0) {
149 $task['progress'] = 100.0;
150 }
151
152 /* ОбновлÑем и разблокируем задачу */
153 mysqli_query($link, "UPDATE `tasks` SET
154 `lock` = 0,
155 `current` = ".mysqli_real_escape_string($link, $task['current']).",
156 `progress` = ".mysqli_real_escape_string($link, $task['progress'])."
157 WHERE `id` = ".mysqli_real_escape_string($link, $task['id']).";");
158
159 /* Ðемного отладочного вывода */
160 print 'task #'.$task['id'].' '.sprintf('%.1f', $task['progress']).' %';
161
162 /* ПроверÑем наличие работы в очереди */
163 $result = mysqli_query($link, "SELECT * FROM `tasks` WHERE `lock` = 0 AND `progress` < 100 LIMIT 1;");
164 if ($result && $task = mysqli_fetch_assoc($result)) {
165 $need_to_restart = true;
166 }
167}
168
169/* ОтключаемÑÑ Ð¾Ñ‚ БД */
170mysqli_close($link);
171
172if ($need_to_restart) {
173 /* ЗапуÑкаем воркер в фоне */
174 exec('/usr/bin/php -f '.__DIR__.'/worker.php > /dev/null 2>&1 &');
175}
176
177?>
178
179var timerHandle = setInterval(function () {
180 $.getJSON("my_file.php", function(counter) {
181 $("#text").html(counter);
182 });
183}, 1000);
184
185<?php
186session_start();
187
188if (empty($_SESSION['counter'])) {
189 $_SESSION['counter'] = 1;
190} elseif ($_SESSION['counter'] < 500) {
191 $_SESSION['counter'] += 1;
192}
193
194echo $_SESSION['counter'];
195// Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ неÑкольких значений можно иÑпользовать json_encode
196
197<form method="POST" id="formx" action="javascript:void(null);" onsubmit="call()">
198 <button>нажми менÑ, Ñкорее ;-)</button>
199</form>
200<div id='text'></div>
201
202<script>
203 function call() {
204 var text = document.getElementById('text');
205 if(typeof(EventSource) !== "undefined") {
206 var source = new EventSource("temp7.php");
207 source.onmessage = function(event) {
208 text.innerText = event.data;
209 };
210 } else {
211 text.innerText = 'EventSource не работает';
212 }
213 }
214</script>
215
216<?php
217header('Content-Type: text/event-stream');
218header('Cache-Control: no-cache');
219
220$i = 0;
221$time = microtime(true);
222$period = 2; // каждые $period Ñекунд будем отправлÑть ответ.
223// в уÑловии цикла пропиÑано ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿Ñ€Ð¾Ð¿Ð¸Ñано true, так он будет работать до беÑконечноÑти,
224// еÑли в Ñвном виде не прервать выполнение Ñкрипта
225// вмеÑто Ñтого лучше напиÑать какое-то выражение, иÑÑ…Ð¾Ð´Ñ Ð¸Ð· которого
226// можно будет положить, что цель Ñкрипта ÑÐµÐ±Ñ Ð¸Ñчерпала (уж не знаю, что вы там делаете).
227// ну либо оÑтавить здеÑÑŒ true, а уже в теле Ñамого цикла вызвать Ñвно exit/break
228while (true) {
229 /*
230 здеÑÑŒ можете выполнÑть хитрые махинации, которые ÑобираетеÑÑŒ делать.
231 например, можно увеличивать $i, чтобы потом было что поÑылать
232 */
233 $i++;
234 if (microtime(true) - $time >= $period) {
235
236 // пишем данные
237 echo "data: $inn";
238 // выплёвываем и ÑбраÑываем ÑиÑтемный буфер вывода.
239 ob_end_flush();
240 flush();
241 $time = microtime(true);
242 }
243 // ÑÑ‚ проÑто чтобы теÑтить, в реале её бы убрать к чертÑм.
244 sleep(1);
245}