За последние 24 часа нас посетили 22529 программистов и 1139 роботов. Сейчас ищут 773 программиста ...

Как увеличить скорость php ?

Тема в разделе "PHP для новичков", создана пользователем AnteFil, 28 июн 2020.

  1. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Добрый день! Нужна помощь . Есть скрипты php которые на заморских серверах работаю за секунды перенёс всё на денвер свой ПК запускаю, но выполняется в десятки раз медленнее. В php.ini отключил лимит памяти но это вообще ни как не повлияло такое чувство что как работало на 128 мб так и работает! Что можно сделать?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    Не использовать древне-устаревший Денвер. Например опенСервер.
    Оттюнинговать настройки сервера.
    Посмотрите текущие через phpinfo()

    Лимит памяти невозможно отключить - поставить большой, максимально большой, но отключить нет.
    Ну лимит памяти можно в самом скрипте устанавливать..

    Надеюсь php версии 7 х используется?
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    От устройства хранения файлов (доступ) немаловажно. Для идеального решения, используют PCI Express
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    А свой комп насколько сильный? Тут же и на винду, и на антивирусы, и на браузеры, и ещё на кучу всего уходит время. Локально почти всегда медленнее. Только это редко проблемы создаёт реальные, поскольку при разработке не так важна скорость реакции.
     
  5. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Щас попробую опенСервер заюзать посмотрю как он справиться)))
    --- Добавлено ---
    Так вот не понимаю сначала увеличил память с 128 до 1024 через диспетчер задач смотрю за нагрузкой она поднимается при старте денвера и на этом всё больше не растёт. Хотя ещё в запасе есть 3 ГБ
    --- Добавлено ---
    Щас опен сервер скачиваю попробую его если не устроит скорость работы значит PCI Express буду тестить
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    А вообще что скрипты делают? Может их оптимизировать надо?
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    @AnteFil, скорость - это не только память
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    ну потести..
    --- Добавлено ---
    Тебе про комп пишут, а ты про борщ с майонезом
     
  9. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Щас опен сервер скачиваю попробую его если не устроит скорость работы значит чёт
    Скорее всего что надо код переписывать сейчас SQL пишет что всего 1 запрос в секунду обрабатывает это писец финиш. База растёт а в месте с ней растёт и время ответа SQL

    В одном цикле идёт два запроса SELECT и один INSERT
    --- Добавлено ---
    Я понял о чём речь, но пока не понятно что делать
    --- Добавлено ---
    Для понимания......минимальный скрипт имеет 10 000 циклов в каждом 3 запроса к базе, sql обрабатывает 1 запрос в 1 секунду. Что вот делать ? Это около 3 часов на обработку а это самый маленький скрипт
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Покажи этот чудесный запрос
     
  11. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Для понимания......минимальный скрипт имеет 10 000 циклов в каждом 3 запроса к базе, sql обрабатывает
    Код (Text):
    1.  
    2. $reg = 1; // Это необходимое значение
    3. // Запускаем цикл в 100 интераций
    4. while ($reg <= '101') {
    5. //Запрашиваю данные с сайта
    6. $json_str = file_get_contents("http://site.ru/reg/".$reg."");
    7. //Декодирую данные
    8. $ppp = json_decode($json_str, true);
    9. //Начинаем обрабатывать полученные данные запускаем в цикле
    10. foreach ($ppp['results'] as $value){
    11.       foreach ($value as $aaaaa){
    12. // Проверяем есть такая запись в базе
    13. $db->query( "SELECT sait FROM укеук WHERE `sait`= '".$aaaaa['id']."' AND `activ` = '1'");
    14. ////Считаем количество в ответе
    15. $row = $db->num_rows();
    16. // Если таких записей нет вернулся ноль то начинаем подготавливать данные к записи в базу
    17. if($row == '0'){
    18. Создаём нужный массив
    19. $massiv_s_ad = explode(",", $aaaaa['vac']['add']['ad']['0']['loc']);
    20. foreach ($massiv_s_ad as $element){
    21. //Удаляем пробелы
    22. $chisti_element = trim($element);
    23. Находим нужные вещи в тексте
    24. if(preg_match("/г\.\s|г\s/", $chisti_element)){
    25.                    
    26.                         if(preg_match('/^г\.(.*)/', $chisti_element)){
    27.                             $del_bukv_toch = substr($chisti_element, 3);
    28.                                 $gorod = trim($del_bukv_toch);
    29.  
    30.                         }
    31.                         if(preg_match('/^г\s(.*)/', $chisti_element)){
    32.                             $del_bukv_toch = substr($chisti_element, 2);
    33.                             $gorod = trim($del_bukv_toch);
    34.                
    35.                     }
    36.                    
    37.                 }  
    38.  
    39. }
    40. $chistim_opisanie1 = preg_replace("/(<[a-z]).*?(>)/i", '\\1\\2', $aaaaa['vac']['du']);
    41. $chistim_opisanie = strip_tags($chistim_opisanie1);
    42.  
    43. $chistim_trim= array("'",'"',".");
    44.             $chistim_kavichki = str_replace($chistim_trim, '', $aaaaa['vac']['com']['name']);  
    45. //Дальше пошла длинаня цепочка из свич
    46. switch($aaaaa['vac']['cat']['spec'])
    47.                 {
    48.                 case "Футболка для мальчика":
    49.                     $category_may = "Мужская одежда";
    50.                 break;
    51. // Идёт около 30 условий  после чего я делаю запрос в базу что бы проверить какому получить id для условия
    52. $sql_id_cat = $db->query( "SELECT * FROM `categor` WHERE `name_categor`='".$category_may."'");
    53.                 $categor_vac = $db->get_row($sql_id_categor);
    54.  
    55. //И наконец записываю всё в базу
    56. $sql = $db->query( "INSERT INTO `название`();
    57. }
    58. }
    59. }
    60. }
     
  12. iceblood

    iceblood Активный пользователь

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    Раз пых подкрутил то и мускуль подправь. Попробуй, если у тебя много данных повесь индексы на поля sait, activ.
     
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Ну вот и ответ.

    Сам пых (если седьмой) работает достаточно быстро, чтобы его скоростью работы можно было пренебречь в большинстве случаев.

    Много времени съедают запросы к БД, если их много / они тяжелые / они к большим таблицам.

    А запросы к удаленным хостам сжирают мегаДофига времени.
    --- Добавлено ---
    Изучи ограничения на кол-во допустимых запросов в сек к АПИ и заюзай мультиКурл.
    Тебе понравится :)
     
    mkramer нравится это.
  14. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Переписал код через мультиКурл но особых изменений не заметил проблема всё же или в большой базе или тяжёлом скрипте

    Всё же быстрее получается где то в два раза
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    @AnteFil База не может давать больше задержку, чем обращение на внешний сервис. Но вместо того, чтобы каждый раз в цикле проверять, была ли такая запись, лучше выгрузить таблицу заранее (если размер позволяет), и проверять выгруженной. Тем более проверяешь только id, вот все айди и выгрузи заранее
     
  16. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Я думал об этом но сейчас в базе 100 000 записей и она будет расти можно ли в массиве держать например 1 000 000 записей я чёт заочковал так делать!
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Тогда дешевле использовать insert ignore/replace, чем писать эту проверку каждый раз. Ну и категорий у тебя точно не миллион, так что их 100 надо вынести из цикла
     
  18. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    О спасибо за идею, но это вряд ли скажется на времени так как если SQL говорит что такая запись есть, то ответ отсекает довольно большой кусок PHP кода. Если же этой отсечки не будет то php будет до конца всё отрабатывать! Пусть и без запроса в sql время мне кажется не сильно изменится. Надо попробовать всё же с массивом оператива позволяет
    Нашёл вот такой эксперимент на хабре
    https://habr.com/ru/post/26762/
    массив из 100000 находит array_search() находит за 0.003 сек
    Щас затестил sql у себя в базе тоже около 100000 записей
    Отображение строк 0 - 0 (1 всего, Запрос занял 0.0003 сек.)
     
    #18 AnteFil, 29 июн 2020
    Последнее редактирование: 29 июн 2020
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Твои регулярки - тьфу, по сравнению с запросом...
     
  20. AnteFil

    AnteFil Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    531
    Симпатии:
    4
    Решил протестировать время работы по каждому циклу от старта до первого ответа из базы на 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 раз
     
    #20 AnteFil, 29 июн 2020
    Последнее редактирование: 29 июн 2020