Intereting Posts
Нужна структура массива в PHP с минимальным использованием памяти Скрининг экрана и сеансы PHP Форма: позвольте пользователю выбрать свою страну (раскрывающийся список) и получить валюту (php) Обнаруживать, когда скрипт задерживается и позволяет ему пропустить или продолжить в PHP Мой div при нажатии не отправляет форму внутри него с помощью js echo html значение тега отдельно для разных блоков Каким будет правильная служба для использования в клиентской библиотеке PHP для Google, чтобы получить базовую информацию, такую ​​как имя и адрес электронной почты? Регулярное выражение PHP. Как получить массив совпадений? Передача пользовательских входных данных с html на php-страницу и отображение содержимого на html-странице без перезагрузки Что такое префикс для двоичного кода в PHP? Как я могу присоединиться к документам Excel с помощью PHPExcel? Лучший способ избежать дублирования ввода в базу данных mysql Проверка правильности в Laravel 5.2 URL-адрес перезаписи для субдомена простой анализатор html dom, чтобы вернуть все значения td`s?

Соединение MYSQL close не может остановить работу вставки

<?php header('Content-Type: text/html; charset=utf8'); $dbhost = '192.168.1.23'; $dbuser = 'demouser01'; $dbpass = 'demo*PW'; $dbname = 'testdb1'; $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection'); mysql_select_db($dbname); mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER_SET_CLIENT='utf8'"); mysql_query("SET CHARACTER_SET_RESULTS='utf8'"); if(isset($_POST['start'])) { $chi = 'chiiiii'; $id = 1; for ($i = 1; $i <= 99999999999; $i++) { $eng = substr(str_shuffle(str_repeat("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 5)), 0, 1024); $math = substr(str_shuffle(str_repeat("1234567890", 6)), 0, 16); $sql = "INSERT INTO test_tb (id,chi,eng,num) VALUES (".$id.",'".$chi."','".$eng."',".$math.")"; $result = mysql_query($sql) or die('MySQL query error'); $id++; } $id = 0; sleep(60); mysql_close($conn); } else if(isset($_POST['stop'])) { mysql_close($conn); } ?> <form action="<?=$_SERVER['PHP_SELF'];?>" method="post"> <input type="submit" name="start" value="Start Insert"> <input type="submit" name="stop" value="Stop Insert"> </form> 

На веб-сайте есть две кнопки, вставка для повторной вставки записи и остановка для вставки. Тем не менее, я попытался использовать соединение MySQL close, он перестанет функционировать в PHP, но активность все еще остается. Вставка все еще продолжает работать. Как решить проблему? Благодарю.

Solutions Collecting From Web of "Соединение MYSQL close не может остановить работу вставки"

Поскольку PHP не позволяет обмениваться ресурсами между запросами (AFAIK), существует несколько способов достижения этой возможности, чтобы остановить процесс в другом запросе:

сначала добавьте эту строку:

 if ( isset ($_POST['start']) ) { $_SESSION['continue'] = true; 

а затем замените ваш оператор while (кажется, вам небезразлично количество итераций, если вы можете изменить это поведение):

 for ($i = 1; $i <= 99999999999; $i++) { 

заменить:

 while ( $_SESSION['continue'] ) 

и вместо закрытия соединения для остановки вставки выполните следующее:

 mysql_close ($con) 

будет:

 $_SESSION['continue'] = false; 

ПРИМЕЧАНИЕ. Не забудьте вызвать session_start () в начале вашего скрипта. Это все.

Я предположил, что вы хотите остановить страницу с той же сессии, если это не так, вы можете использовать ACP ore SHM. например:

заменить:

 $_SESSION['continue'] = true 

с:

 apc_store( 'continue', true ); 

а также

 while ( $_SESSION['continue'] ) 

с:

 while ( acp_fetch ('continue') ) 

а также

 $_SESSION['continue'] = false; 

с:

 apc_store( 'continue', false ); 

Готово!

Каждый ответ на этой странице поворачивается на один пункт:

  • делиться чем-то между несколькими обработчиками PHP HTTP reqests

И, конечно, основная проблема заключается в том, что php не имеет ничего общего .

Поэтому некоторые предлагают использовать сеансы, что может быть довольно сложно сделать, поскольку сеансы не перечитываются перед закрытием, и вы можете легко перезаписать данные в сеансе. Другие предлагают общую память или APC.

Мы говорим о каком-то внешнем семафоре . И, конечно, решение заключается не в том, чтобы закрыть соединение, а в том, чтобы разбить петлю на внешний сигнал.

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

Просто зайдите в базу данных для инструкций начала цикла.

Базы данных обычно предоставляют консультационные блокировки для этой задачи. Например, используя инструкции GET_LOCK и RELEASE_LOCK . Использование IS_FREE_LOCK на каждой итерации вашего основного цикла вставки и снятие этой блокировки с действием остановки – это один из способов сделать это. С проблемой освобождения замка, возможно, после другого сигнала от всех записанных циклов вставки или через некоторое время. Но вы также можете управлять собственной табличной системой.

Одно «преимущество» систем консультативных замков заключается в том, что они игнорируют транзакции. Используя транзакции, вам нужно будет обеспечить, чтобы записи из других транзакций были доступны в вашей области, если вы создаете собственную систему на основе таблиц (нормально, если не сериализуемая транзакция).

Использование базы данных для обмена информацией между экземплярами PHP обычно является ситуацией по умолчанию в LAMP, и вам гарантированно будет иметь этот инструмент в вашей ситуации вставки, что не относится к APC.

Вот полное решение:

 <?php header('Content-Type: text/html; charset=utf8'); $dbhost = '192.168.1.23'; $dbuser = 'demouser01'; $dbpass = 'demo*PW'; $dbname = 'testdb1'; $SHMKEY = ftok ( __FILE__, 'a'); $SHMID = shm_attach ( $SHMKEY ); if ( !shm_has_var ( $SHMID, 1 ) ) { shm_put_var ( $SHMID, 1, true ); } $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection'); mysql_select_db($dbname); mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER_SET_CLIENT='utf8'"); mysql_query("SET CHARACTER_SET_RESULTS='utf8'"); if(isset($_POST['start'])) { $chi = 'chiiiii'; $id = 1; // for ($i = 1; $i <= 99999999999; $i++) { while ( shm_get_var ( $SHMID, 1) ) { $eng = substr(str_shuffle(str_repeat("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 5)), 0, 1024); $math = substr(str_shuffle(str_repeat("1234567890", 6)), 0, 16); $sql = "INSERT INTO test_tb (id,chi,eng,num) VALUES (".$id.",'".$chi."','".$eng."',".$math.")"; $result = mysql_query($sql) or die('MySQL query error'); $id++; } $id = 0; shm_detach ( $SHMID ); sleep(60); mysql_close($conn); } else if(isset($_POST['stop'])) { shm_put_var ( $SHMID, 1, false ); // mysql_close($conn); } ?> <form action="<?=$_SERVER['PHP_SELF'];?>" method="post"> <input type="submit" name="start" value="Start Insert"> <input type="submit" name="stop" value="Stop Insert"> </form> 

Как было сказано:

  • в вашем текущем коде вы фактически закрываете другое соединение (в if(isset($_POST['stop'])) ветвь)

  • вы не можете передавать соединения с MySQL через PHP-скрипты, так как вы не можете хранить ресурсы в сеансе

Однако вы можете сохранить идентификатор соединения и убить это соединение из другого сценария:

 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(isset($_POST['start'])) { // store current connection ID // store an array of connection ID's in case several connections may run simultaneously $result = mysqli_query($conn, 'SELECT CONNECTION_ID()'); $row = mysql_fetch_row($result); $_SESSION['connection_id'] = $row[0]; // close session file // or else concurrent scripts using the same session will be blocked session_write_close(); // do actual work here sleep(10); // keep in mind the connection may be killed from another script at any time, eg if (mysqli_query("...") == false) { // connection was probably killed } // reopen session (optional, do it only if you need your session data later) session_start(); } else if(isset($_POST['stop'])) { // kill pending connection(s) mysqli_kill($conn, $_SESSION['connection_id']); // equivalent query in pure (My)SQL : 'KILL ' . $_SESSION['connection_id'] } 

Вместо KILL [connection_id] вы можете использовать KILL QUERY [connection_id] . Это прекратит выполнение любого выполняемого запроса, но не закроет соединение (но в вашем случае вы, вероятно, хотите полностью закрыть соединение).

Каждый вызов скрипта PHP открывает свое собственное соединение с MySQL, и они не могут мешать друг другу. Исключением являются соединения, открытые с помощью mysql_pconnect() : они остаются открытыми и будут совместно использоваться, но также не могут быть закрыты с помощью mysql_close ().

Вывод: то, что вы пытаетесь сделать, не будет работать (и это плохая идея).

Вместо этого вместо этого вы хотите создать фоновое задание для своих вставок и проверить там сообщение о прерывании (это может быть так же просто, как пустой файл .STOP[PID] с [PID] = идентификатор процесса).

ОБНОВИТЬ:

Могу ли я использовать APC?

Да, вы можете использовать APC для этого сообщения при условии, что расширение APC установлено. Это не так, поэтому эта ошибка:

Вызов неопределенной функции acp_fetch () в /home/ext/library/public/testdb/test.php в строке 31

У вас есть root-доступ к серверу? Затем вы можете установить расширение самостоятельно:

 sudo pecl install apc 

Если эта команда не работает, вам нужно сначала установить установщик PECL, см. Здесь: sudo pecl install apc возвращает ошибку