Язык PHP известен своей простотой и лёгкостью изучения, но некоторые новички часто пишут низкопроизводительный PHP-код, что может серьёзно повлиять на эффективность работы всей системы. В этой статье мы собрали для вас некоторые советы по программированию на PHP и приёмы оптимизации. Надеемся, что начинающие PHP-разработчики внимательно прочитают следующие советы по редактированию и выработают хорошие привычки программирования на PHP!

PHP 编程技巧与优化

63 совета по программированию на PHP

  • 1. Используйте как можно больше встроенных функций PHP.
  • 2. Используйтеechoвместоprint, и используйтеechoнесколько параметров (примечание переводчика: имеются в виду запятые вместо точек) вместо конкатенации строк, например
  • echo $str1,$str2;
    
  • 3. Не разбивайте методы слишком сильно; тщательно продумайте, какой код вы действительно собираетесь повторно использовать.
  • 4. Во время выполненияfor4. Перед выполнением
  • цикла, определите максимальное количество итераций; не вычисляйте максимум на каждой итерации.
  • 5. Удаляйте неиспользуемые переменные, особенно большие массивы, чтобы освободить память.
  • 7, $row['id']Эффективность$row[id]в 7 раз выше, чем у
  • 8. Используйте полные пути при подключении файлов; это потребует меньше времени на разрешение путей операционной системы.
  • 9. Если вы хотите узнать, когда скрипт начал выполняться (примечание переводчика: т. е. когда сервер получает клиентский запрос), используйте$_SERVER['REQUEST_TIME']лучше, чемtime()。
  • 10. Функции могут заменить регулярные выражения для достижения той же функциональности.str_replaceфункция быстрее, чемpreg_replaceфункция, ноstrtrэффективность функцииstr_replaceв четыре раза выше, чем у функции.
  • 11. Обращайте внимание на отступы в коде.
  • 12. Если функция замены строк может принимать массивы или символы в качестве параметров, и длина параметра не слишком велика, рассмотрите возможность написания дополнительного фрагмента кода замены, чтобы каждый раз в качестве параметра передавался один символ, а не писать всего одну строку кода, принимающую массив в качестве параметра поиска и замены.
  • 13. Используйте оператор switch (примечание переводчика: т.е.switch case) вместо несколькихif,else ifинструкциях.
  • 14. Использование @ для подавления сообщений об ошибках очень неэффективно.
  • 15. Включите модуль mod_deflate Apache.
  • 16. Соединения с базой данных следует закрывать, когда они больше не используются.
  • 18. Сообщения об ошибках дорого стоят.
  • 19. Старайтесь не использовать функции в циклах for, напримерfor ($x=0; $x < count($array); $x)count() вызывается на каждой итерации.
  • 20. Инкрементирование локальной переменной внутри метода — самое быстрое. Это почти такая же скорость, как вызов локальной переменной внутри функции.
  • 21. Инкрементирование глобальной переменной в 2 раза медленнее, чем инкрементирование локальной переменной.
  • 22. Инкрементирование свойства объекта (например,$this->prop++) в 3 раза медленнее, чем инкрементирование локальной переменной.
  • 23. Инкрементирование неопределённой локальной переменной в 9–10 раз медленнее, чем инкрементирование предварительно определённой локальной переменной.
  • 24. Простое определение локальной переменной без её вызова в функции также снизит скорость (примерно в той же степени, что и инкрементирование локальной переменной). PHP, вероятно, проверяет, существует ли глобальная переменная.
  • 25. Вызовы методов, по-видимому, не связаны с количеством методов, определённых в классе, потому что я добавил 10 методов (как до, так и после тестирования метода), но производительность не изменилась.
  • 26. Методы в производных классах работают быстрее, чем те же методы, определённые в базовом классе.
  • 27. Вызов пустой функции с одним параметром занимает примерно столько же времени, сколько выполнение 7–8 инкрементирований локальной переменной. Аналогичный вызов метода занимает около 15 инкрементирований локальной переменной.
  • 28. Используйте одинарные кавычки вместо двойных для заключения строк; это быстрее. Потому что PHP ищет переменные в строках, заключённых в двойные кавычки, но не в одинарных. Конечно, это можно делать только тогда, когда не нужно включать переменные в строку.
  • 29. При использованииechoдля вывода нескольких строк используйте запятые вместо точек для разделения строк; это быстрее.
  • 30. Apache тратит в 2–10 раз больше времени на разбор PHP-скрипта, чем на разбор статической страницы HTML. Старайтесь чаще использовать статические страницы HTML и реже — скрипты.
  • 31. Если скрипты не могут быть закэшированы, они будут перекомпилироваться при каждом вызове. Внедрение механизма кэширования PHP обычно позволяет повысить производительность на 25–100%, устраняя накладные расходы на компиляцию.
  • 32. По возможности кэшируйте как можно больше; можно использовать memcached. memcached — это высокопроизводительная распределённая система кэширования объектов в памяти, которую можно использовать для ускорения динамических веб-приложений и снижения нагрузки на базу данных. Кэширование opcode очень полезно, так что скрипты не нужно перекомпилировать при каждом запросе.
  • 33. Когда вы работаете со строками и нужно проверить, соответствует ли их длина определённым требованиям, вы, естественно, используетеstrlen()функция. Эта функция выполняется довольно быстро, потому что она не производит никаких вычислений, а просто возвращает известную длину строки, хранящуюся в структуре zval (встроенная структура данных C, используемая для хранения переменных PHP). Однако, посколькуstrlen()является функцией, она будет работать несколько медленнее, потому что вызов функции проходит через множество шагов, таких как приведение к нижнему регистру (примечание переводчика: имеется в виду, что имя функции приводится к нижнему регистру; PHP не различает имена функций в верхнем и нижнем регистре), хеш-поиск, и они выполняются вместе с вызываемой функцией. В некоторых случаях можно использоватьisset()технику для ускорения выполнения вашего кода.
  • if (strlen($foo) < 5) { echo "Foo is too short"; }
    if (!isset($foo{5})) { echo "Foo is too short"; }
    
  • 34. Если вы можете определить метод класса какstatic, постарайтесь определить его какstatic, его скорость увеличится почти в 4 раза.
  • 35. Не используйтеarray_key_exists, используйтеissetдля проверки, существует ли ключ в массиве.
  • 36. Избегайте использования__set,__getмагических методов, таких как
  • 37. Используйтеinclude/requireвместоinclude_once/require_once, и старайтесь использовать абсолютные пути.
  • 38. Не помещайтеcount/strlen/sizeofи т. д. вforусловия цикла.
  • 39. Старайтесь использоватьforeachвместоfor/while
  • 40. Когда строка содержит переменные, используйте двойные кавычки вместо одинарных, например
  • echo "hi, $name, nice to meet you";
    
  • 41. Используйтеfreadдля чтения небольших файлов используйтеfile_get_contentsдля чтения больших файлов и используйтеfseek
  • для очень больших файлов.ip2long()иlong2ip()42. Используйте
  • функцию для преобразования IP-адреса в целое число для хранения. Это упрощает вычисление того, входит ли конкретный адрес в диапазон, а также ускоряет поиск и сортировку.checkdnsrr()43. При проверке адреса электронной почты используйте
  • функцию для проверки существования домена. Эта встроенная функция позволяет убедиться, что указанный домен может быть разрешён в IP-адрес.mysql_*44. Рассмотрите возможность отказа отmysqli_*функций семейства в пользу улучшенных
  • функций семейства.
  • 45. Научитесь любить тернарный оператор.
  • 46. Если вы чувствуете, что в вашем проекте есть повторно используемая часть, проверьте, есть ли она уже в PEAR, прежде чем писать следующую строку кода. Этот онлайн-репозиторий содержит более 400 повторно используемых фрагментов программ, которые можно сразу использовать в вашей программе. Если только ваш проект не является действительно исключительным, вы всегда сможете найти пакет PEAR, который поможет вам сэкономить время.highlight_file()47. Используйте
  • чтобы автоматически выводить отформатированный, красивый исходный код.error_reporting(0)48. Используйтеphp.iniфункцию, чтобы не позволять пользователям видеть потенциально чувствительную информацию об ошибках. В идеале на продакшн-сервере это должно быть полностью отключено вerror_reporting(0)
  • . Но если вы используете общий веб-сервер, у вас нет собственного файла php.ini, поэтому в этом случае лучший вариант — добавитьgzcompress()иgzuncompress()49. Перед сохранением очень больших строк в веб-базе данных используйте
  • для явного сжатия/распаковки строк.
  • 50. Используйте метод передачи параметров по «ссылке», чтобы получать из функции несколько возвращаемых значений.magic_quotes51. Полностью осознайте опасности «магических кавычек» и SQL-инъекций. Самый простой способ предотвратить SQL-инъекции: в php.ini установитеmysql_real_escape_string()значение On, и используйте
  • функцию для экранирования.
  • 52. Соединения с базой данных следует закрывать, когда они больше не используются; не используйте постоянные соединения.
  • 53. Для глобальных переменных удаляйте их с помощью unset() сразу после того, как закончите их использовать.htmlentities()илиhtmlspecialchars()54. Не доверяйте данным, отправленным пользователями; всегда используйте
  • чтобы сначала экранировать его.$i55. При выполнении$i++инкремента или декремента переменной,++$iмедленнее, чем++$i. Это различие специфично для PHP и не относится к другим языкам, поэтому, пожалуйста, не изменяйте свой код на C или Java и не ожидайте, что он сразу станет быстрее; этого не произойдёт.$i++быстрее, потому что требует всего 3 инструкции (опкода),
  • требует 4 инструкции. Пост-инкремент фактически создаёт временную переменную, которая затем инкрементируется. Пре-инкремент напрямую инкрементирует исходное значение.
  • 56. Не всё должно быть объектно-ориентированным (ООП). ООП часто имеет высокие накладные расходы; каждый вызов метода и объекта потребляет много памяти.
  • 57. Если в вашем коде есть много времязатратных функций, вы можете рассмотреть возможность реализации их в виде расширений на C.
  • 59. mod_zip можно использовать как модуль Apache для сжатия ваших данных на лету, и он может сократить объём передачи данных на 80%.
  • 60. Старайтесь максимально минимизировать файловые операции, хотя эффективность файловых операций в PHP тоже не низка.
  • 61. ОптимизацияSelect SQLИнструкция: выполняйте как можно меньше, когда это возможно.Insert、UpdateДействие
  • 62. Не объявляйте переменные внутри циклов, особенно большие переменные: объекты (Это, похоже, касается не только PHP, верно?)
  • 63. Старайтесь избегать присваивания во вложенных циклах для многомерных массивов.
  • 64、……

Связанные ресурсы