PHP с MySQL работает медленно
( ВАЖНО) ПРАВКА 3: Запуск testajax2.php сам по себе, а НЕ АЯКС. Продолжительность примерно такая же, 1,02-1,03 с. Итак, я предполагаю, что это означает, что проблема в PHP-MYSQL или XAMPP?? При выполнении запроса phpmyadmin вот результат: Показаны строки 0-29 (всего ~50, запрос занял 0,0015 секунды ). Похоже, проблема все-таки не в Ajax, а, возможно, в PHP. Помогите, пожалуйста... (Я также только что отредактировал заголовок вопроса.)
Ответ: Добавьте следующая строка в файле hosts, расположенном в ”C:\Windows\System32\drivers\etc”
127.0.0.1 localhost
Предыдущий вопрос: Нормально ли, что Jquery Ajax с sql-запросами на другой стороне имеет минимальную продолжительность 1 сек? Я пытался
$.get
, $.post
,$.getjson
,$.ajax({type:'POST'})
, $.ajax({type:'GET'})
. Как я уже сказал, это минимум, он может ухудшиться примерно до 3 секунд. Я сомневаюсь, что это sql-запросы, хотя, когда я пробую их в phpmyadmin, результаты появляются очень быстро.
Также не имеет значения, если запросы очень просты, и в таблице всего 2 элемента, она все равно будет соответствовать минимуму 1 сек. Я использую последнюю версию XAMPP, и я не знаю, имеет ли это значение, но я получаю доступ к файлам через localhost и 127.0.0.1. Спасибо!
РЕДАКТИРОВАТЬ: Спасибо за ответ, ребята. Я запускаю его в локальной среде, на том же ноутбуке, на котором я сделал эти файлы. Jquery обновлен. Возвращаемое значение/массив - это json_encoded. Я использую mysqli. База данных находится в InnoDB, и в ней всего около 5 таблиц, и на них почти ничего нет. Вот очень простой пример запроса:
Index.php
var test_id =2;
testcall();
function testcall(){
$.ajax({
url: 'testajax2.php',
type: 'POST',
data: {test_id: test_id},
success: function(data){
}
});
}
Testajax2.php
$mysqli = new mysqli('localhost', 'root', '', 'testdb');
$mysqli->set_charset("utf8");
if(mysqli_connect_errno()) {
echo "Connection Failed: " . mysqli_connect_errno();
exit();
}
$testreceive = $_POST['test_id'];
$query = "SELECT First_Name from tblperson";
$result = $mysqli->query($query);
$row = $result->fetch_all(MYSQLI_ASSOC);
echo json_encode($row);
tblperson содержит 50 записей, и в нем всего 4 столбца. По словам Firebug, для выполнения этой чрезвычайно простой задачи потребовалось 1,03 секунды. Я не уверен, что это на самом деле означает, но, просматривая вкладку Net в Firebug, панель полностью фиолетовая. 0 и 1,03 секунды ожидания. +1,03с и 0 Прием.
ПРАВКА 2: Это также не имеет значения, отправлю ли я их как json_encode($row)
или foreach($row as $value){ echo $value['First_Name']; }
. Это все равно займет не менее 1 секунды. Я пробовал Chrome и Safari, и хотя у меня нет точной продолжительности, я могу сказать, что это примерно одно и то же. Но для простого вызова ajax без SQL-ЗАПРОСОВ. Если я правильно помню, это очень быстро. Я бы вернулся с образцом и выводом продолжительности.
3 answers
Ответ: Добавьте следующую строку в файл hosts, расположенный в ”C:\Windows\System32\drivers\etc”
127.0.0.1 localhost
Это решило мою проблему. PHP-MySQL теперь может выполнить свою задачу в зависимости от того, насколько она сложна где-то между 20-500 мс.
Это может происходить в нескольких местах: 1) сам запрос или 2) создание экземпляра mysqli (и результирующее подключение к бд). Если бы мне пришлось гадать, я подозреваю, что ваша проблема в (2).
Один из быстрых и грязных методов отладки заключается в использовании microtime()
.
Http://www.php.net/manual/en/function.microtime.php
Пример:
$start = microtime(TRUE); // Start counting
$mysqli = new mysqli('localhost', 'root', '', 'testdb');
$temp = microtime(TRUE) - $start;
echo "Time to connect: {$temp}"; // Check elapsed time
$mysqli->set_charset("utf8");
if(mysqli_connect_errno()) {
echo "Connection Failed: " . mysqli_connect_errno();
exit();
}
$temp = microtime(TRUE) - $start;
echo "Time to setup: {$temp}"; // Check elapsed time
$testreceive = $_POST['test_id'];
$query = "SELECT First_Name from tblperson";
$result = $mysqli->query($query);
$temp = microtime(TRUE) - $start;
echo "Time to query: {$temp}"; // Check elapsed time
$row = $result->fetch_all(MYSQLI_ASSOC);
$temp = microtime(TRUE) - $start;
echo "Time to fetch {$temp}"; // Check elapsed time
Проблема заключается в поиске локального хоста с локального хоста до 127.0.0.1.
Решение состоит в том, чтобы либо добавить строку 127.0.0.1 localhost
в файл Windows hosts, как ответил @Wap (и спасибо за ответ!)
Или, если у вас нет доступа к файлу hosts, вы можете просто изменить localhost на 127.0.0.1 в своем вызове php mysqli:
$mysqli = new mysqli('127.0.0.1'), 'root', '', 'testdb');