Автоорский перевод оригинального поста: https://blog.intracto.com/a-jit-compiler-for-php
PHP - это «язык сценариев» ("scripting language"), это означает, что он напрямую не компилируется в машинный язык.
Когда вы запускаете PHP-программу, Zend Engine анализирует код в абстрактном синтаксическом дереве (AST), а далее переводит его в операционные коды (opcodes). Коды операций - это исполнительные блоки для виртуальной машины Zend (Zend VM). Коды операций довольно низкоуровневые и их гораздо быстрее перевести в машинный код, чем исходный код PHP. PHP имеет расширение OPcache в ядре, чтобы кэшировать эти коды операций.
Если в пару строк, то алгоритм работы PHP следующий: Первый запуск PHP-программы начинается с анализа PHP-кода, далее он кешируется в до кодов операций. При последующем использованиии будут использоваться ранее кэшированные коды операций (OPcache). Поэтому всегда проверяйте загружен ли у вас Zend OPcache и активен ли он.
1 сентября 2016 года Дмитрий Стогов (один из разработчиков движка PHP) опубликовал сообщение, в котором он анонсировал работу по созданию нового JIT-компилятора для PHP версии 8.
Компилятор «just in time» (JIT) будет принимать выходные данные кодов операций (opcodes) и вместо их интерпретации он скомпилирует их в машинный код и вместо этого вызовет этот код объекта. JIT должен преодолевать неэффективность интерпретации кодов операций при каждом запуске программы. Интересно?
Обратите внимание, что JVM (Java), CLR (.net) и HHVM (PHP для Facebook) используют подход JIT.
Код доступен в ветке jit-dynasm ZendTech https://github.com/zendtech / php-src / tree / jit-dynasm / ext / opcache / jit , поэтому пока не доступен в официальном репозитории PHP.
Основы поддержки JIT (по крайней мере для 32 и 64-битных платформ) должны быть там. Они используют проект DynASM для генерации кода. Цель состоит в том, чтобы исследовать различные подходы JIT и как они могут быть полезны PHP.
Подходы различаются выбором объекта компиляции (какую часть кода компилировать), как часто и с какой точностью (авт.). Некоторые компиляционные коды JIT используются только один раз, в результате чего компилируется весь объект за раз. Другие могут выбирать один метод (часть кода) и использовать его время от времени и т. д.
Сейчас в PHP все переменные имеют тип данных, объявленные во время компиляции (AOT) - это накладыает ограничения на изменение данных и значений во время выполнения. Но JIT-компиляция работает во время выполнения и может быть быстрее в таких вещах, как переопределение типа даннных, поскольку он может выполнять внутренний анализ процедур во время исполнения. Другими словами, он знает больше о переменных во время выполнения. С другой стороны, первое выполнение JIT, вероятно, медленнее интерпретатора из-за дополнительных шагов перевода, которые он должен обрабатывать.
Я не эксперт в этой области, и все это кажется очень сложным, но очень интересно наблюдать за изменениями в мире PHP. Мне очень любопытно, что из этого получится. Внедрение подобного JIT метода компиляции может сделать PHP более жизнеспособным для интенсивного использования ЦП, такого как машинное обучение, нейросети и т. д.
JIT будет компилировать коды операций для машинного кода и выполнять их. Всё это делается в памяти. Проблемы в том, что по соображениям безопасности память должна быть либо записываемой, либо исполняемой (W ^ X). Но никогда не оба одновременно.
Текущая реализация PHP запрещает запись в буфер JIT во время выполнения, используя системные вызовы mprotect (). Это означает, что PHP-JIT будет компилировать код и записывать его в память и защищать его, чтобы он не изменялся во время выполнения, предотвращая возможные эксплойты.
В настоящее время существует 2 расширения ядра PHP, которые нарушают принцип W ^ X. Phar и PCRE JIT. Но новый PHP JIT в opcache с самого начала учитывает W ^ X, что хорошо.
Я протестировал текущую сборку PHP-JIT в OpenBSD 6.0, в которой по умолчанию включен W ^ X - все работает нормально. Нарушений нет. Обратите внимание, что SELinux также обеспечивает такие виды защиты.
Никаких реальных улучшений производительности нет, по крайней мере, для типичных рабочих нагрузок в Интернете. Можно протестировать PHP-JIT тестовым файлом (доступно в репозиториях PHP) следующим образом:
php -d opcache.jit_buffer_size=32M Zend/bench.php
Edit 25 / jun / 2018: Zeef Suraski пишет, что внедрение JIT показывает значительные улучшения производительности большин нагрузках на ЦП (https://externals.io/message/102415).
Как настроить сендмейл для использования gmail в качестве хоста:
1) устанавливаем сендмейл и дополнительные утилиты:
sudo apt-get install sendmail sasl2-bin
2) перемещаемся в каталог /etc/mail
cd /etc/mail
3) создаём файл authinfo со следующим содержимым:
AuthInfo:smtp.gmail.com "U:username" "I:username@gmail.com" "P:password" "M:PLAIN"
AuthInfo:smtp.gmail.com:587 "U:username" "I:username@gmail.com" "P:password" "M:PLAIN"
4) выполните команду:
sudo makemap -r hash authinfo.db < authinfo
5) создадим SASL файл:
/etc/mail/sasl/sasl.m4
6) отредактируем sendmail.mc :
sudo gedit sendmail.mc
добавим строки как показано ниже (добавленные строки выделены между кода):
dnl #
include(`/etc/mail/m4/dialup.m4')dnl
include(`/etc/mail/m4/provider.m4')dnl
include(/etc/mail/tls/starttls.m4')dnl
include(
/etc/mail/sasl/sasl.m4')dnl
FEATURE(authinfo',
hash /etc/mail/authinfo.db')dnl
define(SMART_HOST',
smtp.gmail.com')dnl
define(RELAY_MAILER_ARGS',
TCP $h 587')dnl
define(ESMTP_MAILER_ARGS',
TCP $h 587')dnl
dnl #
dnl # Default Mailer setup
MAILER_DEFINITIONS
MAILER(`local')dnl
MAILER(`smtp')dnl
7) выполним:
sudo make
sudo /etc/init.d/sendmail reload
8) Если все получилось без ошибок, то релей через gmail настроен. Проверяем!
Отправляем сообщение с локального хоста на mail.ru:
$ sudo mail -v your@mail.ru
Subject: Тестовое сообщение
Это тестовое сообщение
.
...
050 235 2.7.0 Accepted
...
250 2.0.0 pBDA7MDj024641 Message accepted for
delivery
your@mail.ru... Sent (pBDA7MDj024641 Message
accepted for delivery)
Closing connection to [127.0.0.1]
Done!
**
**
Вам надоели люди, которые размещают картинки, опубликованные на вашем сайте — на своих ресурсах, тем самым расходуя ваш траффик и создавая ненужную нагрузку на ваш хостинг? Данный код, размещенный в конце вашего файла .htaccess, позволит предотвратить загрузку ваших изображений — сторонними сайтами.
Options +FollowSymlinks
#Запрещаем загрузку файлов с внешних сайтов
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?site.com/ [nc]
RewriteRule .*.(gif|jpg|png)$ http://site.com/stop.gif[nc]
Не забудьте изменить site.com на ваше доменное имя и создать изображение stop.gif, которое будет показано вместо запрошенной картинки.
**
**
Это правило позволяет заблокировать нежелательные User Agent, которые могут быть потенциально опасными или просто перегружать сервер ненужными запросами.
#Блокируем плохих ботов и роботов
SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Offline.Explorer [NC,OR]
SetEnvIfNoCase user-Agent ^[Ww]eb[Bb]andit [NC,OR]
SetEnvIfNoCase user-Agent ^Zeus [NC]
<limit get="" post="" head="">
Order Allow,Deny
Allow from all
Deny from env=bad_bot
</limit>
Список User Agent браузеров, роботов и пауков поисковых машин, веб-каталогов, менеджеров закачек, спам-ботов и плохих ботов можно найти на сайте List of User-Agents.
**
**
Если по какой-либо причине, вы хотите запретить всем или разрешить только отдельным IP-адресам доступ к вашему сайту — добавьте этот код в ваш .htaccess-файл:
#Запрещаем доступ для всех, кроме указанных IP-адресов
ErrorDocument 403 http://www.domainname.com
Order deny,allow
Deny from all
Allow from 124.34.48.165
Allow from 102.54.68.123
Не забудьте изменить domainname.com на ваше доменное имя.
**
**
Если вы перенесли доменное имя (или свой подсайт) или хотите перенаправлять пользователя на определенную страницу (страницы), без санкций со стороны поисковых машин, используйте этот код:
#Настраиваем SEO-Friendly 301 Redirect
Redirect 301 /1/file.html http://www.site.com/2/file.html
Не забудьте изменить site.com на ваше доменное имя, а /1/file.html и /2/file.html на соответствующие директории и страницы.
**
**
Вам надоел стандартный вид страниц ошибок? Нет проблем — с помощью следующего кода, вы легко можете создать свою страницу и показывать пользователю именно ее:
ErrorDocument 401 /error/401.php
ErrorDocument 403 /error/403.php
ErrorDocument 404 /error/404.php
ErrorDocument 500 /error/500.php
Не забудьте создать в корневой директории вашего сервера папку error и разместить в ней соответствующие файлы.
**
**
Устали от спам-комментариев или определенного пользователя? Просто заблокируйте его IP с помощью следующего кода, добавляемого в .htaccess-файл.
#Создаем черный список IP адресов
allow from all
deny from 145.186.14.122
deny from 124.15.
Узнать IP адреса комментаторов можно или в логах Apache или с помощью сервисов статистики. У многих CMS есть свои встроенные средства для мониторинга адресов посетителей. Например, в Drupal IP- адреса комментаторов можно увидеть в административной панели — Отчеты.
**
**
Используйте данный код, для того, чтобы установить e-mail адрес по-умолчанию для администратора сервера.
#Устанавливаем e-mail адрес по-умолчанию для администратора
ServerSignature EMail
SetEnv SERVER_ADMIN default@domain.com
Не забудьте заменить default@domain.com — своим e-mail адресом.
**
**
Нижеследующий код позволяет вам запретить доступ к любому файлу — при запросе будет выдаваться ошибка 403. Для примера я закрыл доступ к самому файлу htaccess, повысив общий уровень безопасности сайта.
#Защищаем .htaccess файл
<files .htaccess="">
order allow,deny
deny from all
</files>
**
**
В качестве альтернативы компрессии файлов с помощью Gzip, вы можете использовать mod_deflate (предположительно работает быстрее). Разместите следующий код в начале вашего файла .htaccess (также вы можете добавить перечисления .jpg|.gif|.png|.tiff|.ico):
#Сжимаем элементы с помощью mod_deflate
<ifmodule mod_deflate.c="">
<filesmatch .(js|css)$="">
SetOutputFilter DEFLATE
</filesmatch>
</ifmodule>
**
**
Данный код позволяет добавить сроки жизни в заголовки:
#Добавляем срок жизни в заголовки
<filesmatch .(ico|pdf|flv|jpg|jpeg|png|gif|swf)$="">
Header set Expires «Wed, 21 May 2010 20:00:00 GMT»
</filesmatch>
**
**
Обычно страницей по-умолчанию является index.html, однако с помощью этого кода вы можете настроить по-умолчанию любую другую страницу.
#Устанавливаем альтернативную страницу по-умолчанию
DirectoryIndex about.html
**
**
Вы можете включить проверку пароля для доступа в любую папку или файл на вашем сервере, используя этот код:
#защита паролем файла
<files secure.php="">
AuthType Basic
AuthName «Prompt»
AuthUserFile /pub/home/.htpasswd
Require valid-user
</files>
#защита паролем папки
resides
AuthType basic
AuthName «This directory is protected»
AuthUserFile /pub/home/.htpasswd
AuthGroupFile /dev/null
Require valid-user
Для того, чтобы организовать доступ к файлу по паролю, необходимо создать файл .htpasswd и внести в него пару логин-пароль в формате user:password.
Однако в этом случае пароли будут хранится в открытом виде, что не слишком хорошо с точки зрения безопасности. Поэтому оптимальнее пароль зашифровать. Для этого воспользуйтесь сервисами генерации записей в файлы .htpasswd. Например, вот таким.
В нашем примере файл с паролями доступа лежит в корневой директории сайта и называется .htpasswd. Директория указывается от корня сервера и если путь будет некорректным — Apache, не получив доступа к файлу, откажет в доступе к папке любому пользователю — в том чилсе и тому, который ввел правильную пару логин:пароль.
**
**
Используя .htaccess, вы можете настроить перенаправление со старого доменного имени на новое, добавив следующий код:
#Перенаправляем со старого домена old.com — на новый
RewriteEngine On
RewriteRule ^(.*)$ http://www.new.com/$1 [R=301,L]
Перенаправление используется в том случае, если вы переносите свой существующий сайт на новое доменное имя. В этом случае любой пользователь, который наберет в адресной строке www.old.com — будет перенаправлен на www.new.com.
**
**
Использование этого правила не означает прямое ускорение загрузки вашего сайта. Оно предназначено для более быстрой загрузки сайта — для уже заходившего на него посетителя, путем отправки статуса 304 для тех элементов, которые не обновлялись.
Таким образом, при повторной загрузке страницы браузер посетителя не будет заново скачивать изображения, скрипты или CSS, а выведет те файлы, которые уже хранятся в его кеше. Вы можете изменить срок жизни кеша, путем корректирования его значения в годах (year), месяцах (month) или, например — секундах (seconds). В примере указан 1 год.
#Усиливаем кеширование
FileETag MTime Size
<ifmodule mod_expires.c>
<filesmatch ".(jpg|gif|png|css|js)$">
ExpiresActive on
ExpiresDefault «access plus 1 year»
</filesmatch>
</ifmodule>
**
**
При использовании Gzip, сервер будет сжимать файлы перед отправкой их пользователю, ввиду чего ваш сайт будет грузиться быстрее.
#Сжимаем компоненты сайта путем включения Gzip
AddOutputFilterByType DEFLATE text/html text/plain ..
.. text/xml application/xml application/xhtml+xml ..
.. text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
Обратите внимание, что включение компрессии приведет к большей нагрузке на процессор сервера. Здесь строка AddOutputFilterByType записывается в одну длинную строчку с двумя нижними (все .. нужно убрать).
**
**
Для изменения ссылки yourdomain.com/category/blue на yourdomain.com/blue, просто добавьте следующий код в конце вашего .htaccess файла.
#Удаляем category из URL
RewriteRule ^category/(.+)$ http://www.site.com/$1 [R=301,L]
Не забудьте изменить www.site.com на ваше доменное имя.
**
**
Для того, чтобы ограничить доступ к директориям, которые могут содержать разнообразную информацию и для обеспечения безопасности сервера, добавьте этот код в файл .htaccess
#Запрещаем просмотр содержимого папки
Options All —Indexes
**
**
Покажем как это можно сделать на примере RSS-ленты Drupal на сервис Google Feedburner.
#Перенаправляем RSS-ленту Drupal на FeedBurner
<ifmodule mod_rewrite.c="">
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !FeedBurner [NC]
RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
RewriteRule ^rss.xml$ http://feeds.feedburner.com/yourfeed [R=302,NC,L]
</ifmodule>
Изначально необходимо зарегистрировать ленту своего блога в сервисе Feedburner. Далее не забудьте заменить yourfeed на имя вашей ленты уже в Feedburner.
**
**
Чаще всего спам-боты обращаются напрямую к файлу комментариев, например к wp-comments-post.php, не заходя на страницы записей вашего блога. Приведенный ниже код позволяет заблокировать комментарии, отправленные пользователями, которые пришли «из ниоткуда», позволяя комментировать только тем читателям, которые перешли на страницу вашего блога с каких-либо других страниц (например, результатов поиска Google).
#Запрещаем комментарии от пользователей без Referrer
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .comment\/reply\/*
RewriteCond %{HTTP_REFERER} !.*yourblog.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
Не забудьте заменить yourblog.com на доменное имя вашего блога.
**
**
Данный код позволяет удалить расширение файла .php (вы можете изменить его на любое другое, например — .html) из URL-адресов страниц.
#Убираем расширение файла из URL
RewriteRule ^(([^/]+/)*[^.]+)$ /$1.php [L]
**
**
Данный код позволяет защитить сайт от scripts enjection и нежелательных модификаций _REQUEST и/или GLOBALS:
#Включаем отслеживание сим-ссылок
Options +FollowSymLinks
#Запускаем url_rewriting
RewriteEngine On
#Блокируем все ссылки, содержащие <script>
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
#Блокируем все скрипты, которые пытаются изменить переменные PHP Globals:
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
#Блокируем все скрипты, которые пытаются изменить переменную _REQUEST:
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
#Перенаправляем все подобные на страницу с ошибкой 403 — запрещено
RewriteRule ^(.*)$ index.php [F,L]
**
**
Еще одна полезная директива, рекомендуемая к использованию — RedirectMatch. Цитата: «Эта директива позволяет в качестве запрашиваемого адреса использовать регулярное выражение (пересылка не „с документа“, а „со всех документов, типа ...“). Редирект внешний — браузеру сообщается о необходимости загрузить другую страницу.
Синтаксис:
RedirectMatch [status] regexp URL
Значения статусов (код возврата веб-сервера) стандартные:
permanent (301 — постоянный редирект), temp (302 — временный редирект, приходите ещё), seeother (303 — летим туда, там много вкусного), gone (410 — удалён навсегда).
Пример:
То же перенаправление со старого домена на новый без подключения RewriteEngine:
RedirectMatch 301 ^(.*)$ www.domainname.com/$1
От себя добавлю, что вы можете использовать не только http-статусы, но и другие условия:
RedirectMatch (.*)\.gif$ http://www.myserver.com$1.png
RedirectMatch (.*\.jpg)$ http://www.myanother.com$1
Обязательно сделайте резервную копию файла .htaccess до внесения изменений и проверьте работоспособность всего сайта — после добавления новых строк.
**
**
Хотлинк (Hotlink) — вставка прямых ссылок изображений или файлов с одного сайта на другие. Этот прием используется довольно часто, ну например, у вас на сервере не хватает места для хранения картинок и вы пользуетесь каким-либо бесплатным сервисом для хранения файлов изображений, т.е. загружаете картинку, получаете URL и вставляете его на свой сайт.
В итоге: вы сохраняете место для вашего сайта и используете пропускную способность хостинга для картинок, но это уже не ваше дело. Но вот как быть, если кто-то решил, что ваш сайт можно использовать как подобный сервис.
Как не стать бесплатным поставщиком изображений и файлов?
Есть ли защита от этого? Да, есть! Чтобы запретить другим сайтам пользоваться вашим трафиком и/или просто указывать прямые ссылки на ваши файлы (картинки), то добавьте в ваш .htaccess файл следующие строки:
# Запретить другим сайтам использовать прямые ссылки на ваши картинки
RewriteCond %{HTTP_REFERER} !^$
# Дальше список разрешенных доменов
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?sitename.ru.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?sitename.ru:80.*$ [NC]
# IP сайта (домена)
RewriteCond %{HTTP_REFERER} !^http(s)?://111.111.111.111.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://111.111.111.111:80.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?yandex.ru [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?google. [NC]
# RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?домен_дружественного сайта.ru [NC]
RewriteCond %{HTTP_REFERER} !search?q=cache [NC]
# Форматы файлов, для которых устанавливается защита
# Выводит ошибку 403
# RewriteRule \.(jpe?g|bmp|gif|png|css|mov|swf|dcr|exe|rar|avi|vob|zip|pdf|txt|doc|flv|mp3|mp4)$ — [NC,F,L]
# или показывает спецрисунок вместо указанного
RewriteRule .*\.(jpe?g|bmp|gif|png)$ files/images/nohotlink.jpg [NC,L]
В итоге все остальные сайты получат ошибку 403 Forbidden (т.е. Доступ запрещен) и ваша пропускная способность больше «не работает на других».
**
**
Для ImageCache предыдущий пункт работать не будет, поэтому добавляем такие настройки:
SetEnvIfNoCase Referer «^$» local_ref=1
# Allowed domains
# Далее разрешенные домены
SetEnvIfNoCase Referer «^http://(www\.)?domain\.ru» local_ref=1
SetEnvIfNoCase Referer «^http://(www\.)?domain\.com» local_ref=1
# File extensions that you want to protect
# Расширения файлов, которые нужно защитить
<FilesMatch "\.(bmp|jpe?g|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
Теперь у нас есть и защита от хотлинка и модуль ImageCache — вместе они работают превосходно. Одно «но» — таким способом, как вы видите не получится выдавать другую картинку; только защита своих изображений, что и является основной целью.
Будущее веба? - Веб разработка в 2022 году.
In Russian language.
Закидываю рабочую настройку Apache 2.4 + PHP7 with pThreads. Всё настраивалось на серверах Oracle с многопоточным процессором Sun4v.
APACHE --htmldir=/www --prefix=/etc/apache2 --enable-so
copy PHP from: git clone https://github.com/php/php-src.git --depth=1
PHP7 pthreads 1) скачать и скопировать pthreads в /soft/php-7.0.*/ext/pthreads 2) выполнить sudo ./buildconf --force 3) выполнить sudo ./configure --prefix=/etc/php7 --with-apxs2=/etc/apache2/bin/apxs --enable-bcmath --with-zlib=/usr/local --with-curl=/usr/include/curl --with-pcre-dir=/usr/include --with-gettext=/usr/include --with-pgsql=/usr/lib/postgresql/9.5 --enable-zip --with-pear=/etc/php7 --with-tsrm-pthreads --enable-maintainer-zts --with-zlib=/usr/local --with-openssl --enable-pthreads=shared --disable-cli --enable-cli --enable-iconv --enable-mbstring
NORMAL 3) выполнить sudo ./configure --prefix=/etc/php7 --with-apxs2=/etc/apache2/bin/apxs --with-bz2 --with-zlib --enable-zip --enable-soap --enable-intl --with-mcrypt --with-openssl --with-readline --with-curl --enable-pcntl --with-gettext --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-xsl --enable-bcmath --enable-mbstring --enable-calendar --enable-simplexml --enable-json --enable-hash --enable-session --enable-xml --enable-wddx --enable-opcache --with-pcre-regex --with-config-file-path=/etc/php7 --with-config-file-scan-dir=/etc/php7 --with-pgsql
CONFIGURE_STRING="--prefix=/etc/php7 --with-bz2 --with-zlib --enable-zip --disable-cgi --enable-soap --enable-intl --with-mcrypt --with-openssl --with-apxs2=/etc/apache2/bin/apxs --with-pgsql=/usr/lib/postgresql/9.5 --with-readline --with-curl --enable-ftp --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-sockets --enable-pcntl --with-pspell --with-enchant --with-gettext --with-gd --enable-exif --with-jpeg-dir --with-png-dir --with-freetype-dir --with-xsl --enable-bcmath --enable-mbstring --enable-calendar --enable-simplexml --enable-json --enable-hash --enable-session --enable-xml --enable-wddx --enable-opcache --with-pcre-regex --with-config-file-path=/etc/php7/cli --with-config-file-scan-dir=/etc/php7/etc --enable-cli --enable-maintainer-zts --with-tsrm-pthreads --enable-debug --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data"
./configure $CONFIGURE_STRING
SOLARIS10: --with-openssl=/usr/sfw/include/openssl
CONFIGURE_STRING="--prefix=/etc/php7 --with-bz2 --with-zlib --enable-zip --disable-cgi --enable-soap --enable-intl --with-mcrypt --with-pgsql --with-readline --with-curl --enable-ftp --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-sockets --enable-pcntl --with-pspell --with-enchant --with-gettext --with-gd --enable-exif --with-jpeg-dir --with-png-dir --with-freetype-dir --with-xsl --enable-bcmath --enable-mbstring --enable-calendar --enable-simplexml --enable-json --enable-hash --enable-session --enable-xml --enable-wddx --enable-opcache --with-pcre-regex --with-config-file-path=/etc/php7/cli --with-config-file-scan-dir=/etc/php7 --enable-cli --enable-maintainer-zts --with-tsrm-pthreads --enable-debug --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data"
./configure $CONFIGURE_STRING
./configure --help файл просто чо-бы не валялся в системе, напоминалка
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print checking ...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for
--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or `..']
Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX]
By default,
make install' will install all the files in
/usr/local/bin',/usr/local/lib' etc. You can specify an installation prefix other than
/usr/local' using--prefix', for instance
--prefix=$HOME'.
For better control, use the options below.
Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR]
System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST]
Optional Features and Packages: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-libdir=NAME Look for libraries in .../NAME rather than .../lib --disable-rpath Disable passing additional runtime library search paths --enable-re2c-cgoto Enable -g flag to re2c to use computed goto gcc extension --disable-gcc-global-regs whether to enable GCC global register variables
SAPI modules:
--with-apxs2=FILE Build shared Apache 2.0 Handler module. FILE is the optional pathname to the Apache apxs tool apxs --disable-cli Disable building CLI version of PHP (this forces --without-pear) --enable-embed=TYPE EXPERIMENTAL: Enable building of embedded SAPI library TYPE is either 'shared' or 'static'. TYPE=shared --enable-fpm Enable building of the fpm SAPI executable --with-fpm-user=USER Set the user for php-fpm to run as. (default: nobody) --with-fpm-group=GRP Set the group for php-fpm to run as. For a system user, this should usually be set to match the fpm username (default: nobody) --with-fpm-systemd Activate systemd integration --with-fpm-acl Use POSIX Access Control Lists --with-litespeed Build PHP as litespeed module --enable-phpdbg Build phpdbg --enable-phpdbg-webhelper Build phpdbg web SAPI support --enable-phpdbg-debug Build phpdbg in debug mode --disable-cgi Disable building CGI version of PHP
General settings:
--enable-gcov Enable GCOV code coverage (requires LTP) - FOR DEVELOPERS ONLY!! --enable-debug Compile with debugging symbols --with-layout=TYPE Set how installed files will be laid out. Type can be either PHP or GNU [PHP] --with-config-file-path=PATH Set the path in which to look for php.ini [PREFIX/lib] --with-config-file-scan-dir=PATH Set the path where to scan for configuration files --enable-sigchild Enable PHP's own SIGCHLD handler --enable-libgcc Enable explicitly linking against libgcc --disable-short-tags Disable the short-form <? start tag by default --enable-dmalloc Enable dmalloc --disable-ipv6 Disable IPv6 support --enable-dtrace Enable DTrace support --enable-fd-setsize Set size of descriptor sets
Extensions:
--with-EXTENSION=shared[,PATH]
NOTE: Not all extensions can be build as 'shared'.
Example: --with-foobar=shared,/usr/local/foobar/
o Builds the foobar extension as shared extension.
o foobar package install prefix is /usr/local/foobar/
--disable-all Disable all extensions which are enabled by default
--disable-libxml Disable LIBXML support --with-libxml-dir=DIR LIBXML: libxml2 install prefix --with-openssl=DIR Include OpenSSL support (requires OpenSSL >= 0.9.8) --with-kerberos=DIR OPENSSL: Include Kerberos support --with-system-ciphers OPENSSL: Use system default cipher list instead of hardcoded value --with-pcre-regex=DIR Include Perl Compatible Regular Expressions support. DIR is the PCRE install prefix BUNDLED --without-sqlite3=DIR Do not include SQLite3 support. DIR is the prefix to SQLite3 installation directory. --with-zlib=DIR Include ZLIB support (requires zlib >= 1.0.9) --with-zlib-dir=
'flavour' can be one of: ibm-db2, iODBC, unixODBC, generic
If ',dir' part is omitted, default for the flavour
you have selected will be used. e.g.:
--with-pdo-odbc=unixODBC
will check for unixODBC under /usr/local. You may attempt
to use an otherwise unsupported driver using the \"generic\"
flavour. The syntax for generic ODBC support is:
--with-pdo-odbc=generic,dir,libname,ldflags,cflags
When built as 'shared' the extension filename is always pdo_odbc.so
--with-pdo-pgsql=DIR PDO: PostgreSQL support. DIR is the PostgreSQL base install directory or the path to pg_config --without-pdo-sqlite=DIR PDO: sqlite 3 support. DIR is the sqlite base install directory BUNDLED --with-pgsql=DIR Include PostgreSQL support. DIR is the PostgreSQL base install directory or the path to pg_config --disable-phar Disable phar support --disable-posix Disable POSIX-like functions --with-pspell=DIR Include PSPELL support. GNU Aspell version 0.50.0 or higher required --with-libedit=DIR Include libedit readline replacement (CLI/CGI only) --with-readline=DIR Include readline support (CLI/CGI only) --with-recode=DIR Include recode support --disable-session Disable session support --with-mm=DIR SESSION: Include mm support for session storage --enable-shmop Enable shmop support --disable-simplexml Disable SimpleXML support --with-libxml-dir=DIR SimpleXML: libxml2 install prefix --with-snmp=DIR Include SNMP support --with-openssl-dir=DIR SNMP: openssl install prefix --enable-soap Enable SOAP support --with-libxml-dir=DIR SOAP: libxml2 install prefix --enable-sockets Enable sockets support --enable-sysvmsg Enable sysvmsg support --enable-sysvsem Enable System V semaphore support --enable-sysvshm Enable the System V shared memory support --with-tidy=DIR Include TIDY support --disable-tokenizer Disable tokenizer support --enable-wddx Enable WDDX support --with-libxml-dir=DIR WDDX: libxml2 install prefix --with-libexpat-dir=DIR WDDX: libexpat dir for XMLRPC-EPI (deprecated) --disable-xml Disable XML support --with-libxml-dir=DIR XML: libxml2 install prefix --with-libexpat-dir=DIR XML: libexpat install prefix (deprecated) --disable-xmlreader Disable XMLReader support --with-libxml-dir=DIR XMLReader: libxml2 install prefix --with-xmlrpc=DIR Include XMLRPC-EPI support --with-libxml-dir=DIR XMLRPC-EPI: libxml2 install prefix --with-libexpat-dir=DIR XMLRPC-EPI: libexpat dir for XMLRPC-EPI (deprecated) --with-iconv-dir=DIR XMLRPC-EPI: iconv dir for XMLRPC-EPI --disable-xmlwriter Disable XMLWriter support --with-libxml-dir=DIR XMLWriter: libxml2 install prefix --with-xsl=DIR Include XSL support. DIR is the libxslt base install directory (libxslt >= 1.1.0 required) --enable-zip Include Zip read/write support --with-zlib-dir=DIR ZIP: Set the path to libz install prefix --with-pcre-dir ZIP: pcre install prefix --with-libzip=DIR ZIP: use libzip --enable-mysqlnd Enable mysqlnd explicitly, will be done implicitly when required by other extensions --disable-mysqlnd-compression-support Disable support for the MySQL compressed protocol in mysqlnd --with-zlib-dir=DIR mysqlnd: Set the path to libz install prefix
PEAR:
--with-pear=DIR Install PEAR in DIR [PREFIX/lib/php] --without-pear Do not install PEAR
Zend:
--enable-maintainer-zts Enable thread safety - for code maintainers only!! --disable-inline-optimization If building zend_execute.lo fails, try this switch --enable-zend-signals Use zend signal handling
TSRM:
--with-tsrm-pth=pth-config Use GNU Pth --with-tsrm-st Use SGI's State Threads --with-tsrm-pthreads Use POSIX threads (default)
Libtool:
--enable-shared=PKGS Build shared libraries default=yes --enable-static=PKGS Build static libraries default=yes --enable-fast-install=PKGS Optimize for fast installation default=yes --with-gnu-ld Assume the C compiler uses GNU ld default=no --disable-libtool-lock Avoid locking (might break parallel builds) --with-pic Try to use only PIC/non-PIC objects default=use both --with-tags=TAGS Include additional configurations automatic
Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -LYet Another Compiler Compiler' implementation to use.
Defaults to the first program found out of:
bison -y', byacc',
yacc'.
YFLAGS The list of arguments that will be passed by default to $YACC.
This script will default YFLAGS to the empty string to avoid a
default value of `-d' given by some make applications.
CXX C++ compiler command
CXXFLAGS C++ compiler flags
CXXCPP C++ preprocessor
Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations.
Report bugs to the package provider.
Здесь такое дело. Как-то, с год назад, я начал в плотную осваивать языки программирования для моих проектов (genme.net, sistemaexport.ru).
Долго выбирал, с чего начать. И был выбран PHP, т.к. его знал немного ранее, был опыт, понимание и т.д. Тем более, что меня интересовала как многопоточность, скорость расчетов, так и серверная база.
Короче. Ковырялся в Windows с установкой denwer. Возможностей там раз-два... PostgreSQL - проблема, MySQL - проблема, PHP-cli - проблема... короче снес. Затем поставил openserver. Тоже не лучший вариант: нет многопоточности (нормального cli режима), да и с настройкой проблемы... Ну да ладно, первые скрипты были написаны там. Затем, за буквально два дня, для автономной работы был поднят сервер на ubuntu desktop. И поняслись постоянные проблемы с отладкой т.к. скрипны написаны в Windows среде, а исполняются в Linux...
Выход был найден установкой Ubuntu Desktop на лэптоп с разбивкой жесткого диска на разделы и установкой Grub.
Помогло на время - пока не закончилось место в логическом разделе Linux. А создание новых разделов привысило допустимы лимит... Выход был один - разносить системы на отдельные носители.
Решил поставить дополнительны диск в рабочий лэптоп, а т.к. слотов для подключения нового девайса нет - была найдена вот такая штуковина:
Слева - SSD. Справа - переходник вместо CDROM`а.
Весело и радужно всё запихнули в агрегат:
И началась пляска с бубном...
1) Ранее, уже как три месяца к времени апгрейда, у меня вылетел Windows. Так что было решено перенести всю инфу и разделы на новый диск с полным копированием. Инструктаж.
2) Загружаемся с LiveCD, Фигачим в cmd:
sudo fdisk –l
sudo dd if=/dev/sdb of=/dev/sdc
Фигня с объемом...
3) Ждем nn-ое количество времени и пытаемся восстановить Windows с уже нового носителя. Бесполезно, разделы нарушены. Мало того, т.к. диски были с точностью скопированы, название и ID разделов конфиктовали друг с другом, не дав запуститься...
4) Фарматнул новый SSD. Установил Windows с USB ISO. Скопировал через Ubuntu Live CD дату на новый SSD. Зпустил Windows. OK
5) Далее, монируем оба SSD, где SSD с Windows уходит как хламосборщик в слот от CDROM. Загружаемся с Ubuntu LiveCD, бновляем grub, пытаемся запустить linux => error, бесконечно вылетаем в emergency mode. Пытаемся запустить Windows => boot error. Кусок говна.
6) Силой мысли и форумов, пытаемся понять, что проблема в загрузочных секторах - конфликт. Проверяем bios, убеждаемся, что bios не видит новый SSD (тот, что через переходник). Это плохо, но всё возможно.
7) Думая о лучшем, удаляем boot сектор на SSD c Linux и восстанавливаем загрузчик Windows, затем Grub. Пример. Херачим:
bootrec.exe /FixMbr
bootrec.exe /FixBoot
bootsect /NT60 SYS
И update grub, ранее, а сейчас Boot Repair.
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update && sudo apt-get install -y boot-repair
И снова попадаем в замкнутый круг. Ubuntu слетает к чертям в emergency, windows не грузится.
Пытаемся решить задачу. Мы же упрямые. Да и нагадили уже по самое.
8) Выносим мозг с восстановлением разделов на старом SSD (тот, что Linux): работаем через Ubuntu Live CD с уилитой testdisk. Выискиваем глубоко и долго. Восстанавливаем нужные разделы.
9) Копируем данные linux в наш новый SSD - в мусоросборщик. Форматируем разделы и переустанавливаем Ubuntu. Запуск. OK! Ubuntu джобает. Windows сопротивляется...
10 ) Восстанавливаем загрузчик Windows... в очередной раз. Загружаемся с Windows USB, заходим в командную строку, пишем:
bootrec /FixMbr
bootrec /FixBoot
Не помогает. =) А помогает только:
bootrec /RebuildBcd
11) Грузим то-да-сё. Всё работает. Ура!
Квест пройден. Бубен порван и 24 часа жизни успешно отправлены в корзину.
Резюме: Думай дважды, юный падаван, перед началом большого пути... ;-) Нужно было сразу разносить по носителям, теперь еще и софт восстанавливать...