Php5 справочник
Содержание:
- Об этой статье
- Информация о процессоре
- finally
- Мёртвый код: найти и обезвредить
- Overview
- Known Problems
- Overview
- Incompatibilities (made on purpose and are not going to be fixed)
- Пример
- General
- How to Download, Build, Install and Test
- Новая функциональность
- Добавлена возможность загружать расширения по имени (RFC)
- Добавлена возможность перегружать абстрактные функции (RFC)
- Запрещено передавать null в качестве параметра для get_class() (RFC)
- Вызов Count с параметром, который нельзя посчитать (RFC)
- Возможность расширения типа параметра (RFC)
- Добавлена возможность указывать запятую в конце группированных неймспейсов (RFC)
- Реализовано семейство функций socket_getaddrinfo (RFC)
- Улучшены TLS-константы (RFC)
- В ядро PHP добавлена Libsodium (RFC)
- Добавлен алгоритм Argon2 в хешировании пароля (RFC)
- HashContext as Object (RFC)
- Установка
- Future Engine Optimization Ideas
- Appendix A. Survey
Об этой статье
wikiHow работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали, в том числе анонимно, 13 человек(а). Количество просмотров этой статьи: 16 301.
Категории: Программирование
English:Check PHP Version
Español:verificar la versión de PHP
Italiano:Controllare la Versione di un Server PHP
Português:Verificar a Versão do PHP
Deutsch:Die Version von PHP überprüfen
Français:connaitre votre version de PHP
Bahasa Indonesia:Mengecek Versi PHP
Nederlands:De PHP‐versie controleren
ไทย:เช็คเวอร์ชั่น PHP
中文:查看PHP版本
Tiếng Việt:Kiểm tra phiên bản PHP
العربية:التحقق من إصدار البي إتش بي
日本語:PHPのバージョンを確認する
한국어:PHP 버전 확인 방법
हिन्दी:पीएचपी (PHP) वर्जन का पता लगाएँ (Check PHP Version)
Türkçe:PHP Sürümü Nasıl Öğrenilir
Печать
Информация о процессоре
Для этого необходимо использовать метод getrusage(). Но учтите, что на Windows эта функция работать не будет.
print_r(getrusage()); /* prints Array ( => 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0 ) */
Картина, изложенная выше, будет понятно тем, у кого есть опыт в системном администрировании. Для всех остальных предлагаем расшифровку:
- ru_oublock: количество операций блочной записи
- ru_inblock: количество операций блочного чтения
- ru_msgsnd: количество отправленных сообщений
- ru_msgrcv: количество принятых сообщений
- ru_maxrss: максимальный размер невыгружаемого набора
- ru_ixrss: общий объем разделяемой памяти
- ru_idrss: общий объем неразделяемых данных
- ru_minflt: количество используемых страниц памяти
- ru_majflt: количество ошибок отсутствия страниц
- ru_nsignals: количество принятых сигналов
- ru_nvcsw: количество переключений контекста процессом
- ru_nivcsw: количество принудительных переключений контекста
- ru_nswap: количество обращений к диску при подкачке страниц
- ru_utime.tv_usec: время работы в пользовательском режиме (микросекунды)
- ru_utime.tv_sec: время работы в пользовательском режиме (секунды)
- ru_stime.tv_usec: время работы в привилегированном режиме (микросекунды)
- ru_stime.tv_sec: время работы в привилегированном режиме (секунды)
Для того чтобы узнать какие ресурсы вашего процессора используются скриптом, вам необходимо значение ‘user time’ (время работы в пользовательском режиме) и ’system time’ (время работы в привилегированном режиме). Вы можете получить результат как в секундах, так и в микросекундах. Для того чтобы превратить общее количество секунд в десятичное число, вам необходимо разделить значение микросекунд на 1 миллион и добавить к значению секунд.
Запутанно как-то. Вот пример:
// отдыхаем 3 секунды sleep(3); $data = getrusage(); echo "User time: ". ($data + $data / 1000000); echo "System time: ". ($data + $data / 1000000); /* выводит User time: 0.011552 System time: 0 */
Хотя выполнение скрипта заняло около 3-х секунд, процессор не был сильно нагружен. Дело в том, что при вызове (sleep) скрипт практически не потребляет ресурсов процессора. Вообще существует множество задач, которые занимают значительное время, но при этом не используют процессор. К примеру, ожидание операций связанных с диском. Так что вы не всегда используете процессорное время в своих скриптах.
Вот ещё пример:
// пройтись 10 миллионов раз for($i=0;$i<10000000;$i++) { } $data = getrusage(); echo "User time: ". ($data + $data / 1000000); echo "System time: ". ($data + $data / 1000000); /* выводит User time: 1.424592 System time: 0.004204 */
Работа скрипта заняла 1.4 секунды процессорного времени. В данном случае, время системных вызовов вообще низкое.
Время работы в привилегированном режиме (System Time) – это время, которое процессор затрачивает на выполнение системных запросов к ядру от имени программы. Пример:
$start = microtime(true); // вызываем microtime каждые 3 секунды while(microtime(true) - $start < 3) { } $data = getrusage(); echo "User time: ". ($data + $data / 1000000); echo "System time: ". ($data + $data / 1000000); /* выводит User time: 1.088171 System time: 1.675315 */
Теперь системного времени затратилось намного больше, чем в прошлом примере. Всё благодаря методу microtime(), который использует ресурсы системы.
Однако следует отметить, что выведенное время может быть не точным, т.к. в данный момент времени ресурсы процессора используются и другими программами, что в результате может дать небольшую погрешность.
finally
В PHP 5.5 было добавлено ключевое слово finally, которое довольно-таки часто встречается и в других языках. С помощью finally, мы можем создать блок кода, который выполнится в конце конструкции try/catch, вне зависимости от того, было выброшено исключение или нет.
Без finally, разработчикам часто приходилось делать двойной вызов каких-то функций или дублировать код. К примеру, в следующем примере вызов функции releaseResource() происходит в нескольких местах:
<?php function doSomething() { $resource = createResource(); try { $result = useResource($resource); } catch (Exception $e) { releaseResource($resource); log($e->getMessage()); throw $e; } releaseResource($resource); return $result; }
Воспользуемся новым ключевым словом finally:
<?php function doSomething() { $resource = createResource(); try { $result = useResource($resource); return $result; } catch (Exception $e) { log($e->getMessage()); throw $e; } finally { releaseResource($resource); } }
Теперь функция releaseResource() будет вызвана единожды, вне зависимости от того будет выкинуто исключение или нет. Даже если в блоке try будет использоваться слово return, блок finally выполнится в любом случае.
Мёртвый код: найти и обезвредить
Меня зовут Данил Мухаметзянов, я работаю бэкенд-разработчиком в Badoo уже семь лет. За это время я успел создать и изменить большое количество кода. Настолько большое, что в один прекрасный день ко мне подошёл руководитель и сказал: «Квота закончилась. Чтобы что-то добавить, нужно что-то удалить».
Ладно, это всего лишь шутка — он такого не говорил. А жаль! В Badoo за всё время существования компании накопилось больше 5,5 млн строк логического бизнес-кода без учёта пустых строк и закрывающих скобок.
Само количество не так страшно: он лежит, есть не просит. Но два-три года назад я начал замечать, что всё чаще читаю и пытаюсь разобраться в коде, который на самом деле не работает в продакшен-окружении. То есть, по сути, мёртв.
Эту тенденцию заметил не только я. В Badoo поняли: наши высокооплачиваемые инженеры постоянно тратят время на мёртвый код.
Overview
-
Code MUST follow a “coding style guide” PSR .
-
Code MUST use 4 spaces for indenting, not tabs.
-
There MUST NOT be a hard limit on line length; the soft limit MUST be 120
characters; lines SHOULD be 80 characters or less. -
There MUST be one blank line after the declaration, and there
MUST be one blank line after the block of declarations. -
Opening braces for classes MUST go on the next line, and closing braces MUST
go on the next line after the body. -
Opening braces for methods MUST go on the next line, and closing braces MUST
go on the next line after the body. -
Visibility MUST be declared on all properties and methods; and
MUST be declared before the visibility; MUST be declared
after the visibility. -
Control structure keywords MUST have one space after them; method and
function calls MUST NOT. -
Opening braces for control structures MUST go on the same line, and closing
braces MUST go on the next line after the body. -
Opening parentheses for control structures MUST NOT have a space after them,
and closing parentheses for control structures MUST NOT have a space before.
Known Problems
-
foreach may behave differently
- tests/lang/foreachLoop.013.phpt
- tests/lang/foreachLoop.014.phpt
- tests/lang/foreachLoop.015.phpt
-
ext/standard/tests/serialize/serialization_arrays_005.phpt
-
user code in error handler may cause destruction of array, element of which is currently processedZend/tests/bug54265.phpt
-
_toString() may behave differentlyZend/tests/bug60825.phpt (it was a bogus behavior in php5.6 and below)
-
Internal object constructors can’t set $this to NULL-
ext/fileinfo/tests/bug61173.phpt -
ext/fileinfo/tests/finfo_open_error.phpt -
ext/pdo_mysql/tests/pdo_mysql_construct.phpt -
ext/pdo_mysql/tests/pdo_mysql_construct_options.phpt -
ext/intl/tests/breakiter_construct_error.phpt -
ext/intl/tests/bug62017.phpt -
ext/intl/tests/dateformat_construct_bad_tz_cal.phpt -
ext/intl/tests/formatter_format2.phpt -
ext/intl/tests/gregoriancalendar_construct_error.phpt -
ext/intl/tests/resourcebundle_create.phpt
-
-
Internal object constructors can’t set $this to NULL when called indirectly — parent::__construct()
- ext/date/tests/bug67118.phpt
- ext/date/tests/bug67118_2.phpt
-
PDP Persistent connection handling-
ext/pdo_mysql/tests/bug63176.phpt -
ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt -
ext/pdo_sqlite/tests/bug43831.phpt
-
-
Passing scalars by reference may behave differently, because they don’t have reference counters anymore
-
Zend/tests/bug35393.phpt -
ext/pdo_firebird/tests/pdo_005.phpt -
ext/pdo_mysql/tests/pdo_005.phpt -
ext/pdo_odbc/tests/pdo_005.phpt -
ext/pdo_pgsql/tests/pdo_005.phpt -
ext/pdo_sqlite/tests/pdo_005.phpt
-
-
We can’t catch situations when argument passed to internal function was modified by callback-
ext/standard/tests/array/unexpected_array_mod_bug.phpt -
ext/standard/tests/strings/bug55871.phpt (it was a bogus behavior in php5.6 and below)
-
-
Memory or resource leaksext/standard/tests/http/bug60570.phpt
-
Inconsistent reference behaviour <?php $a = ‘foo’; $a = &$a; $a = array(); $a = $a; var_dump($a); ?>ext/wddx/tests/bug48562.phpt
-
Bug in GCZend/tests/bug63635.phpt (visible with valgrind)
-
GC doesn’t destroy inner-loopsext/standard/tests/array/compact_variation1.phpt
-
Improper resource destructionext/standard/tests/streams/bug61115.phpt (visible with valgrind)
-
Arrays are not allowed in class constants-
Zend/tests/bug67368.phpt -
Zend/tests/constant_expressions_self_referencing_array.phpt
-
-
Improperly detected resource leaks during pharcmd build -
Memory leak if pdo persistent dbh lost connection to server -
accepts some arguments for by-ref params that it did not previously. Reproduce code:
Overview
This specification extends, expands and replaces PSR-2, the coding style guide and
requires adherence to PSR-1, the basic coding standard.
Like PSR-2, the intent of this specification is to reduce cognitive friction when
scanning code from different authors. It does so by enumerating a shared set of rules
and expectations about how to format PHP code. This PSR seeks to provide a set way that
coding style tools can implement, projects can declare adherence to and developers
can easily relate to between different projects. When various authors collaborate
across multiple projects, it helps to have one set of guidelines to be used among
all those projects. Thus, the benefit of this guide is not in the rules themselves
but the sharing of those rules.
PSR-2 was accepted in 2012 and since then a number of changes have been made to PHP
which has implications for coding style guidelines. Whilst PSR-2 is very comprehensive
of PHP functionality that existed at the time of writing, new functionality is very
open to interpretation. This PSR, therefore, seeks to clarify the content of PSR-2 in
a more modern context with new functionality available, and make the errata to PSR-2
binding.
Previous language versions
Throughout this document, any instructions MAY be ignored if they do not exist in versions
of PHP supported by your project.
Incompatibilities (made on purpose and are not going to be fixed)
-
PHPNG doesn’t keep original values of arguments passed to user functions, so func_get_arg() and func_get_args() will return current value of argument instead of the actually passed. The following code is going to be affected “function foo($x) { $x = 2; return func_get_arg(0);} var_dump(foo(1));”
- tests/lang/func_get_arg.001.phpt
- tests/lang/func_get_args.004.phpt
-
Function parameters with duplicate name are not allowed anymore. Definitions like “function foo($x,$x) {}” will lead to compile time error “Redefinition of parameter”
- Zend/tests/bug54013.phpt
- Zend/tests/bug64515.phpt
-
var_dump() may print recursive data structures differently
Zend/tests/closure_026.phpt
- Passing scalars by reference may behave differently, because they don’t have reference counters anymore
Пример
Можно решать разные задачи в несколько потоков. Мне было интересно решить одну конкретную и как мне кажется весьма типовую задачу. Напомню ее еще раз. Есть пул заданий, их надо побыстрее выполнить.
Так давайте приступим. Для этого создадим провайдер данных (Threaded), он будет один и общий для всех потоков.
Для каждого потока у нас будет (Worker), где будет храниться ссылка на провайдер.
Сама обработка каждой задачи пула, (пусть это будет некая ресурсоемкая операция), наше узкое горлышко, ради которого мы и затеяли многопоточность, будет в (Threaded).
Обратите внимание, что данные из провайдера забираем в. Иначе есть вероятность часть данных обработать более 1 раза, или пропустить часть данных.
Теперь заставим все это работать с помощью
Получается довольно элегантно на мой взгляд. Этот пример я выложил на гитхаб.
Вот и все! Ну почти все. На самом деле есть то, что может огорчить пытливого читателя. Все это не работает на стандартном PHP, скомпилированным с опциями по умолчанию. Чтобы насладиться многопоточностью, надо, чтобы в вашем PHP был включен ZTS (Zend Thread Safety).
General
2.1 Basic Coding Standard
Code MUST follow all rules outlined in PSR-1.
The term ‘StudlyCaps’ in PSR-1 MUST be interpreted as PascalCase where the first letter of
each word is capitalized including the very first letter.
2.2 Files
All PHP files MUST use the Unix LF (linefeed) line ending only.
All PHP files MUST end with a non-blank line, terminated with a single LF.
The closing tag MUST be omitted from files containing only PHP.
2.3 Lines
There MUST NOT be a hard limit on line length.
The soft limit on line length MUST be 120 characters.
Lines SHOULD NOT be longer than 80 characters; lines longer than that SHOULD
be split into multiple subsequent lines of no more than 80 characters each.
There MUST NOT be trailing whitespace at the end of lines.
Blank lines MAY be added to improve readability and to indicate related
blocks of code except where explicitly forbidden.
There MUST NOT be more than one statement per line.
2.5 Keywords and Types
All PHP reserved keywords and types MUST be in lower case.
Any new types and keywords added to future PHP versions MUST be in lower case.
Short form of type keywords MUST be used i.e. instead of ,
instead of etc.
How to Download, Build, Install and Test
mkdir ~/tmp cd ~/tmp git clone git@git.php.net:php-src.git cd php-src ./buildconf ./configure \ --prefix=$HOME/tmp/usr \ --with-config-file-path=$HOME/tmp/usr/etc \ --enable-mbstring \ --enable-zip \ --enable-bcmath \ --enable-pcntl \ --enable-ftp \ --enable-exif \ --enable-calendar \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-wddx \ --with-curl \ --with-mcrypt \ --with-iconv \ --with-gmp \ --with-pspell \ --with-gd \ --with-jpeg-dir=/usr \ --with-png-dir=/usr \ --with-zlib-dir=/usr \ --with-xpm-dir=/usr \ --with-freetype-dir=/usr \ --with-t1lib=/usr \ --enable-gd-native-ttf \ --enable-gd-jis-conv \ --with-openssl \ --with-mysql=/usr \ --with-pdo-mysql=/usr \ --with-gettext=/usr \ --with-zlib=/usr \ --with-bz2=/usr \ --with-recode=/usr \ --with-mysqli=/usr/bin/mysql_config make make install mkdir $HOME/tmp/usr/etc vi $HOME/tmp/usr/etc/php.ini
max_execution_time=600 memory_limit=128M error_reporting=0 display_errors=0 log_errors=0 user_ini.filename= realpath_cache_size=2M cgi.check_shebang_line=0 zend_extension=opcache.so opcache.enable_cli=1 opcache.save_comments=0 opcache.fast_shutdown=1 opcache.validate_timestamps=1 opcache.revalidate_freq=60 opcache.use_cwd=1 opcache.max_accelerated_files=100000 opcache.max_wasted_percentage=5 opcache.memory_consumption=128 opcache.consistency_checks=0
Now PHP must be installed and configured. The final check.
$ sapi/cli/php -v PHP 7.0.0-dev (cli) (built: Apr 28 2014 11:13:04) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.7.0-dev, Copyright (c) 1998-2014 Zend Technologies with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
You may run synthetic benchmarks
$ sapi/cli/php Zend/bench.php $ sapi/cli/php Zend/micro_bench.php
You may measure the performance of some web applications
$ sapi/cgi/php-cgi -T 1000 /var/www/html/wordpress/index.php > /dev/null''
You may do the same with callgrind profiler
$ valgrind --tool=callgrind --dump-instr=yes --separate-recs=1 sapi/cgi/php-cgi -T 100 /var/www/html/wordpress/index.php > /dev/null
Finally, you may run PHP as FastCGI server using CGI SAPI or FPM (it requires additional configuration)
$ PHP_FCGI_CHILDREN=4 PHP_FCGI_MAX_REQUESTS=0 sapi/cgi/php-cgi -b /tmp/fcgi-php
I would recommend build PHP from master and phpng branches and compare their performance
Новая функциональность
Добавлена возможность загружать расширения по имени (RFC)
Раньше и в файле php.ini содержали пути до файла расширения.
Но, к сожалению, имя файла зависело от платформы. Например, в unix-подобных системах оно строилось как , где это на всех системах кроме HP-UX, где он . В Windows имя файла формируется как . Всё это порождало много ошибок.
Теперь вы можете писать:
И нужные расширения будут подгружены в зависимости от ОС.
Этот механизм будет работать при установке extension и zend_extension в ini-файле, а также как аргумент для функции .
Но абсолютные пути по-прежнему необходимо будет указывать при флаге в CLI-режиме, а также при указании абсолютного пути. Следующий пример работать не будет:
Добавлена возможность перегружать абстрактные функции (RFC)
Теперь вы сможете перегрузить абстрактные функции точно так же, как и обычные функции:
До PHP 7.2 выдавалась ошибка вида:
Предыстория:
В PHP есть два типа данных, которые содержат ключ/значение. Первый — это массивы, которые могут содержать ключи в виде строк или чисел. При этом если строка удовлетворяет правилу и она достаточно маленькая , то она конвертируется в числовой ключ.
Второй тип — это объекты, в которых недопустимы числовые ключи, и ключи конвертируются в строки.
При этом в Zend Engine они представлены в виде одной структуры .
Теперь это исправлено.
Давайте посмотрим на пару примеров:
Запрещено передавать null в качестве параметра для get_class() (RFC)
Когда null передается как параметр внутри контекста класса, поведение функции может быть весьма неожиданным:
Если содержит действительный объект, возвращенный из репозитория, результатом функции будет имя класса этого объекта.
Если содержит , выход будет иметь контекст класса, из которого вызывается , в этом случае .
Эта особенность нарушает принцип наименьшего удивления: «если необходимая функция имеет высокий коэффициент удивления, может потребоваться перепроектирование этой функции».
Теперь будет выдаваться предупреждение:
Если вы хотите сохранить старое поведение, придётся переписать код:
Вызов Count с параметром, который нельзя посчитать (RFC)
Теперь вызов с параметром, который является скалярным, null или объектом, который не реализовал интерфейс Countable, будет выдавать .
Возможность расширения типа параметра (RFC)
Одно из самых горячо обсуждаемых изменений — возможность не указывать тип параметра в наследнике. Таким образом наследник сможет принять параметр любого типа.
До PHP 7.2 возвращалась ошибка:
В пулл реквесте мнения разделились.
Одни говорили:
Другие считают, что:
Добавлена возможность указывать запятую в конце группированных неймспейсов (RFC)
Планировалось добавить такую возможность и для других списков, но на стадии голосования они были отменены и будут по-прежнему возвращать :
Реализовано семейство функций socket_getaddrinfo (RFC)
Теперь из PHP будет доступна информация из , реализованная на C. Это недостающая функция для текущей библиотеки сокетов. При работе с различными сетями было бы полезно разрешить рассказать нам, какие методы подключения/прослушивания будут наиболее подходящими с учетом набора подсказок.
Были утверждены четыре функции:
Улучшены TLS-константы (RFC)
Теперь:
- имеет дефолтное значение
- это алиас к
- константа имеет дефолтное значение вместо
- константа считается устаревшей и позже будет удалена.
В ядро PHP добавлена Libsodium (RFC)
Libsodium — современная криптографическая библиотека, которая предлагает аутентифицированное шифрование, высокоскоростную криптографию с эллиптическими кривыми и многое другое. В отличие от других криптографических стандартов (которые являются набором криптографических примитивов, например, WebCrypto), libsodium включает в себя тщательно подобранные алгоритмы, реализованные экспертами по безопасности. Это поможет избежать уязвимостей в сторонних каналах.
Добавлен алгоритм Argon2 в хешировании пароля (RFC)
Argon2 — это современный простой алгоритм, направленный на высокую скорость заполнения памяти и эффективное использование нескольких вычислительных блоков.
HashContext as Object (RFC)
Начиная с PHP5 предпочтительной структурой для хранения внутренних данных были объекты. По какой-то причине в расширении Hash для этого использовались ресурсы. Данный RFC пытается исправить недоразумение, переведя расширение Hash на хранение внутренних данных в виде объектов.
Примеры использования ресурса в качестве внутреннего представления:
Внутреннее представление преобразуется из ресурса в объект. Существующий код должен продолжить работать, если он не использует явных проверок is_resource(), эти проверки могут быть легко заменены на is_resource | is_object.
Установка
Интерпретатор PHP поставляется в нескольких вариантах для разных режимов запуска интерпретатора.
Чтобы установить PHP-CLI выполните:
sudo apt-get install php5-cli
Чтобы установить PHP—CGI выполните:
sudo apt-get install php5-cgi
Чтобы установить PHP-FPM выполните:
sudo apt-get install php5-fpm
Модуль для Apache
PHP в виде модуля для Apache можно установить так:
sudo apt-get install libapache2-mod-php5
Включить модуль PHP 5 в Apache:
sudo a2enmod php5
Перезагрузить Apache:
sudo service apache2 restart
Проверка PHP
В папке /var/www (или в корне любого другого виртуального хоста) создайте файл test.php, дайте права на чтение из него всем (или хотя бы пользователю ) и запишите в него следующую строку:
<?php phpinfo(); ?>
Future Engine Optimization Ideas
-
Split IS_BOOL into IS_FALSE and IS_TRUE. -
Introduce immutable arrays. They don’t need to be copied and might be used directly from opcache shared memory.They might be also useful for APCU. -
Bundle libpcre with JIT support. ext/pcre must use it out of the box. -
Think about parameter passing/receiving. Currently parameters passed to user functions are copied twice. First by SEND and then by RECV. -
Refactor zend_parse_parameters() API (It’s slow like a hell. for ord() function it takes 90% of CPU time). See PHP RFC: Fast Parameter Parsing API -
Convert some simple and often used internal functions into more efficient opcodes — e.g. defined(), strlen(), is_array()… -
Replace Zend Memory Manager with xx_malloc (it must give us at least additional 2% improvement) - Use interned zend_strings for often used strings in C code.
-
arg_info->name should be zend_string*, but we have to initialize it from C code. -
Think about CALL/RETURN related optimizations. Function call/return code is the main consumer of CPU time now. -
Try to optimize VM instructions dispatching. May be use global register for “execute_data”. May be also keep “opline” in CPU register? - move zend_op.lineno into a separate compressed debug_info table.
-
Try to reduce amount of data copied from OPCache SHM into process memory on each request -
Try to replace ext/json with pecl/jsond
Appendix A. Survey
In writing this style guide, the group took a survey of member projects to
determine common practices. The survey is retained herein for posterity.
A.2. Survey Legend
:
The type of indenting. = “Use a tab”, or = “number of spaces”
:
The “soft” line length limit, in characters. = not discernible or no response, means no limit.
:
The “hard” line length limit, in characters. = not discernible or no response, means no limit.
:
How classes are named. = lowercase only, = lowercase with underscore separators, = StudlyCase.
:
Does the opening brace for a class go on the line as the class keyword, or on the line after it?
:
How are class constants named? = Uppercase with underscore separators.
:
Are the , , and keywords spelled as all case, or all case?
:
How are methods named? = , = lowercase with underscore separators.
:
Does the opening brace for a method go on the line as the method name, or on the line?
:
Does the opening brace for a control structure go on the line, or on the line?
:
Is there a space after the control structure keyword?
:
Do control structures always use braces?
:
When using or , does it go on the line as the previous closing brace, or does it go on the line?
:
How many times are and indented from an opening statement?
:
Do function calls have a space after the function name and before the opening parenthesis?
:
In files containing only PHP, is the closing tag required?
:
What type of line ending is used?
:
When declaring a method, does come first, or does the visibility come first?
:
In a control structure expression, is there a space after the opening parenthesis and a space before the closing parenthesis? = , = .
:
Is there a blank line after the opening PHP tag?
:
A summary of what line the opening braces go on for classes, methods, and control structures.