Добрый день! Нужна помощь . Есть скрипты php которые на заморских серверах работаю за секунды перенёс всё на денвер свой ПК запускаю, но выполняется в десятки раз медленнее. В php.ini отключил лимит памяти но это вообще ни как не повлияло такое чувство что как работало на 128 мб так и работает! Что можно сделать?
Не использовать древне-устаревший Денвер. Например опенСервер. Оттюнинговать настройки сервера. Посмотрите текущие через phpinfo() Лимит памяти невозможно отключить - поставить большой, максимально большой, но отключить нет. Ну лимит памяти можно в самом скрипте устанавливать.. Надеюсь php версии 7 х используется?
А свой комп насколько сильный? Тут же и на винду, и на антивирусы, и на браузеры, и ещё на кучу всего уходит время. Локально почти всегда медленнее. Только это редко проблемы создаёт реальные, поскольку при разработке не так важна скорость реакции.
Щас попробую опенСервер заюзать посмотрю как он справиться))) --- Добавлено --- Так вот не понимаю сначала увеличил память с 128 до 1024 через диспетчер задач смотрю за нагрузкой она поднимается при старте денвера и на этом всё больше не растёт. Хотя ещё в запасе есть 3 ГБ --- Добавлено --- Щас опен сервер скачиваю попробую его если не устроит скорость работы значит PCI Express буду тестить
Щас опен сервер скачиваю попробую его если не устроит скорость работы значит чёт Скорее всего что надо код переписывать сейчас SQL пишет что всего 1 запрос в секунду обрабатывает это писец финиш. База растёт а в месте с ней растёт и время ответа SQL В одном цикле идёт два запроса SELECT и один INSERT --- Добавлено --- Я понял о чём речь, но пока не понятно что делать --- Добавлено --- Для понимания......минимальный скрипт имеет 10 000 циклов в каждом 3 запроса к базе, sql обрабатывает 1 запрос в 1 секунду. Что вот делать ? Это около 3 часов на обработку а это самый маленький скрипт
Для понимания......минимальный скрипт имеет 10 000 циклов в каждом 3 запроса к базе, sql обрабатывает Код (Text): $reg = 1; // Это необходимое значение // Запускаем цикл в 100 интераций while ($reg <= '101') { //Запрашиваю данные с сайта $json_str = file_get_contents("http://site.ru/reg/".$reg.""); //Декодирую данные $ppp = json_decode($json_str, true); //Начинаем обрабатывать полученные данные запускаем в цикле foreach ($ppp['results'] as $value){ foreach ($value as $aaaaa){ // Проверяем есть такая запись в базе $db->query( "SELECT sait FROM укеук WHERE `sait`= '".$aaaaa['id']."' AND `activ` = '1'"); ////Считаем количество в ответе $row = $db->num_rows(); // Если таких записей нет вернулся ноль то начинаем подготавливать данные к записи в базу if($row == '0'){ Создаём нужный массив $massiv_s_ad = explode(",", $aaaaa['vac']['add']['ad']['0']['loc']); foreach ($massiv_s_ad as $element){ //Удаляем пробелы $chisti_element = trim($element); Находим нужные вещи в тексте if(preg_match("/г\.\s|г\s/", $chisti_element)){ if(preg_match('/^г\.(.*)/', $chisti_element)){ $del_bukv_toch = substr($chisti_element, 3); $gorod = trim($del_bukv_toch); } if(preg_match('/^г\s(.*)/', $chisti_element)){ $del_bukv_toch = substr($chisti_element, 2); $gorod = trim($del_bukv_toch); } } } $chistim_opisanie1 = preg_replace("/(<[a-z]).*?(>)/i", '\\1\\2', $aaaaa['vac']['du']); $chistim_opisanie = strip_tags($chistim_opisanie1); $chistim_trim= array("'",'"',"."); $chistim_kavichki = str_replace($chistim_trim, '', $aaaaa['vac']['com']['name']); //Дальше пошла длинаня цепочка из свич switch($aaaaa['vac']['cat']['spec']) { case "Футболка для мальчика": $category_may = "Мужская одежда"; break; // Идёт около 30 условий после чего я делаю запрос в базу что бы проверить какому получить id для условия $sql_id_cat = $db->query( "SELECT * FROM `categor` WHERE `name_categor`='".$category_may."'"); $categor_vac = $db->get_row($sql_id_categor); //И наконец записываю всё в базу $sql = $db->query( "INSERT INTO `название`(); } } } }
Раз пых подкрутил то и мускуль подправь. Попробуй, если у тебя много данных повесь индексы на поля sait, activ.
Ну вот и ответ. Сам пых (если седьмой) работает достаточно быстро, чтобы его скоростью работы можно было пренебречь в большинстве случаев. Много времени съедают запросы к БД, если их много / они тяжелые / они к большим таблицам. А запросы к удаленным хостам сжирают мегаДофига времени. --- Добавлено --- Изучи ограничения на кол-во допустимых запросов в сек к АПИ и заюзай мультиКурл. Тебе понравится
Переписал код через мультиКурл но особых изменений не заметил проблема всё же или в большой базе или тяжёлом скрипте Всё же быстрее получается где то в два раза
@AnteFil База не может давать больше задержку, чем обращение на внешний сервис. Но вместо того, чтобы каждый раз в цикле проверять, была ли такая запись, лучше выгрузить таблицу заранее (если размер позволяет), и проверять выгруженной. Тем более проверяешь только id, вот все айди и выгрузи заранее
Я думал об этом но сейчас в базе 100 000 записей и она будет расти можно ли в массиве держать например 1 000 000 записей я чёт заочковал так делать!
Тогда дешевле использовать insert ignore/replace, чем писать эту проверку каждый раз. Ну и категорий у тебя точно не миллион, так что их 100 надо вынести из цикла
О спасибо за идею, но это вряд ли скажется на времени так как если SQL говорит что такая запись есть, то ответ отсекает довольно большой кусок PHP кода. Если же этой отсечки не будет то php будет до конца всё отрабатывать! Пусть и без запроса в sql время мне кажется не сильно изменится. Надо попробовать всё же с массивом оператива позволяет Нашёл вот такой эксперимент на хабре https://habr.com/ru/post/26762/ массив из 100000 находит array_search() находит за 0.003 сек Щас затестил sql у себя в базе тоже около 100000 записей Отображение строк 0 - 0 (1 всего, Запрос занял 0.0003 сек.)
Решил протестировать время работы по каждому циклу от старта до первого ответа из базы на 3100 циклов в итоге curl_multi - время 142,4759529 file_get_contents - время 144,5317361 Хотя завершение первого цикла curl_multi - время 0,75851202, второй тест 1,032655001 file_get_contents - время 0,189507008 второй тест 0,238109112 curl_multi использовалась 1 раз file_get_contents использовались 31 раз