Мой профиль...

Search This Blog

Showing posts with label php. Show all posts
Showing posts with label php. Show all posts

Thursday, June 9, 2016

Switch between PHP versions on the same machine - Переключение между версиями РНР на одном компьютере

Переключение между версиями PHP на одной машине

Возникла задача:

  1. Иметь версию php без расширения gettext (Если ставить из пакетов, то оно уже предустановлено и выпиливается с трудом)
  2. Иметь возможность быстро переключаться между версиями php на своей машине (сейчас происходит фаза активного перехода с 5.6 на 7.x)
Сходу было найдено решение: phpbrew. Тут сейчас опишу те подводные камни, на которые наплыл.

Как установить phpbrew

curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew

Как работает phpbrew

В home dir создается папка .phpbrew. Внутри нее в подпапке php будут все наши версии php с установленными зависимостями

Установка новой версии php

phpbrew install x.y.z
Возвращаясь к моей проблеме №1 - отключение расширения gettext, я делал установку следующим образом
phpbrew install x.y.z -gettext

Переключение между версиями php

phpbrew switch 5.4.18

Возможные проблемы при установке

У меня при сборке появилась следующая проблема
checking for BZip2 support... yes
checking for BZip2 in default path... not found
configure: error: Please reinstall the BZip2 distribution
*** There was an error while trying to configure php. Check the custom/suphp/configure.php5 file
Суть проблемы в том, что пакет BZip2 установлен, а вот dev версия пакета - нет.
Решается следующим образом:
yum install bzip2-devel
 или
apt-get install libbz2-dev
Аналогичная проблема была с readline
Более универсальное решение в моем случае
apt-cache search libreadline
и ставим нужный пакет.

Установка расширение php

phpbrew ext install xdebug
Не забудьте предварительно переключится на нужную версию php

You can also install extension via PECL and enable it manually:
pecl install mongo
phpbrew ext enable mongo
В моем случае при установке расширения oci8 возникли следующие проблемы:

  1. Нужно было отследить совместимость версии php и pecl расширения и ставить только нужную версию
  2. phpbrew не хотел включать (enable) расширение. Решилось путем создания oci8.ini руками и написание внутри "extension=oci8.so"
Установка php-7.0 zts:
> phpbrew install --name php-7.0-zts 7.0 +default -gettext +apxs2=/usr/bin/apxs2 +openssl +mcrypt +zts

Friday, November 7, 2014

PHP: конструктор по умолчанию (default constructors)

Рассмотрим следующий код:
  1. class Animal {  
  2.     protected $what = "nothing";  
  3.     function sound() {  
  4.         echo get_class($this)." says {$this->what}";   
  5.     }  
  6. }  
  7.    
  8. class Cow extends Animal {  
  9.     protected $what = "moo";  
  10.     protected $owner;  
  11.     public function __construct($owner) {  
  12.         // parent::__construct(); (?)  
  13.         $this->owner = $owner;  
  14.     }  
  15. }  
  16.    
  17. $a = new Cow("Old McDonald");  
  18. $a->sound();  
В данном коде представлена простая иерархия классов.
Теперь посмотрим на 12-ую строку кода отмеченную (?). Конечно, в данном случае мы можем не вызывать родительский конструктор, но...

Предположим, со временем мы дополнили родительский класс:
  1. class Animal {  
  2.    protected $born;  
  3.    public function __construct() {  
  4.       $this->born = time();  
  5.    }  
  6. }  
Вроде бы, мы ничего не поменяли, но теперь все наследуемые классы работают неверно, т.к. не вызывают родительский конструктор. Для того чтобы это исправить, нам нужно пройтись по всем классам потомкам и добавить вызов родительского конструктора.

Мы могли бы избежать этой проблемы, если бы придерживались простого правила: вставлять вызов родительского конструктора, даже когда он пустой. Если родительский конструктор не определен, то вызов parent::__construct() не будет делать ровным счетом ничего. Но, если мы когда либо внедрим родительский конструктор, все наши дочерние классы будут готовы.

Friday, June 4, 2010

Миграция на php 5.3.x

Переход на PHP 5.3.x.


Устаревшие функции в PHP 5.3.x. Deprecated функции:


• call_user_method() - используем теперь call_user_func()
• call_user_method_array() - используем теперь call_user_func_array()
• define_syslog_variables() - по умолчанию и далее выключен
• dl()
• ereg() - используем теперь preg_match()
• ereg_replace() - используем теперь preg_replace()
• eregi() - используем теперь preg_match() с модификатором 'i'
• eregi_replace() - используем теперь preg_replace() с модификатором 'i'
• set_magic_quotes_runtime() / magic_quotes_runtime() - будут ликвидированы
• session_register() - используем суперглобальный массив $_SESSION
• session_unregister() - используем суперглобальный массив $_SESSION
• session_is_registered() - используем суперглобальный массив $_SESSION
• set_socket_blocking() - впредь используйте stream_set_blocking()
• split() - используем теперь preg_split()
• spliti() - используем теперь preg_split() с модификатором 'i'
• sql_regcase()
• mysql_db_query() - впредь используйте mysql_select_db() и mysql_query()
• mysql_escape_string() - впредь используйте mysql_real_escape_string()

E_DEPRECATED в php.ini

Кроме того, ряд директив в PHP.INI постигла такая же участь, они будут теперь выбрасывать E_DEPRECATED предупреждения при активировании:
• define_syslog_variables
• register_globals
• register_long_arrays
• safe_mode
• magic_quotes_gpc
• magic_quotes_runtime
• magic_quotes_sybase

Отключенные возможности

Так же больше не используются следующие возможности:
• Передача в переменную параметра по ссылке в new
• Вызов call-time (функцииб методы классов) по ссылке
• Использование {} для указания смещения внутри строки. Обращайтесь к строке как к массиву, используя []

Зарезервированные слова

Следующие 2 слова теперь являются зарезервированными:
• GOTO
• NAMESPACE

Временная зона

В новой версии PHP обязательно необходимо указать в конфигурационном файле php.ini параметр date.timezone иначе интерпретатор будет отображать Вам предупреждения при работе с любой функцией даты или времени. Например, можно указать так:
date.timezone = Europe/Kiev

Публичные методы

Начиная с 5.3 методы указанные ниже не могут быть статичными и обязаны быть публичными:
• __get()
• __set()
• __isset()
• __unset()
• __call()

Saturday, November 17, 2007

Полезная информация для сеошников о редиректах в PHP - SEO and PHP Redirect Code HTTP status

Цитата("Dylan at WeDefy dot com")
The HTTP status code changes the way browsers and robots handle redirects, so if you are using header(Location:) it's a good idea to set the status code at the same time. Browsers typically re-request a 307 page every time, cache a 302 page for the session, and cache a 301 page for longer, or even indefinitely. Search engines typically transfer "page rank" to the new location for 301 redirects, but not for 302, 303 or 307. If the status code is not specified, header('Location:') defaults to 302.


Код

<?php
// 301 Moved Permanently -перемещено навсегда
header("Location: /foo.php",TRUE,301);

// 302 Found - найдено (по умолчанию)
header("Location: /foo.php",TRUE,302);
header("Location: /foo.php");

// 303 See Other - следует посмотреть другую страницу
header("Location: /foo.php",TRUE,303);

// 307 Temporary Redirect - временный редирект
header("Location: /foo.php",TRUE,307);
?>


Иначе говоря: от номера кода "HTTP status" отправляемого вебсервером клиенту в заголовках зависит то каким образом отдаваемую странцу воспринимают броузеры и поисковые роботы, поэтому если вы используете заголовок location, то хорошей идеей будет сразу уже устанавливать соответствующий HTTP status code.

При 307-ом редиректе броузеры каждый раз сначало пробуют загрузить исходную страницу на которой был временный редирект, кэшируют результаты редиректа с кодом 302 - на время сессии, и а с кодом 301 - практически навсегда.

Поисковые системы, как правило, переносят значение pagerank со страниц с 301-ым редиректом, на страницу назначения, при чем в случае с другими кодами: 302, 303 или 307 - этого не происходит. Если статус код не указан (как это обычно делалось у меня smile.gif ) отправляется код 302.


А теперь бонус, не относящийся к редиректам но относящийся к отправке HTTP status code, для того чтобы отпарвить заголовок "404 страница не найдена", используйте следующий код:
Код

<?php
header("HTTP/1.0 404 Not Found");
?>


Кроме того когда нужно просто отправить опредленный код и при этом отобразить пользователю какую то справочную информацию, точно так же как 404-ый код отправляем заголовок с любым другим статус кодом:

Код

<?php
header("HTTP/1.0 307");
echo "Страница временно не доступна."
?>


Думаю поисковики воспримут как нужно, а пользователь оценит по достоинству, по крайней мере в некоторых CMS - информационные сообщения о причине редиректа - просто жизненно необходимы.

Другие коды:
Код

[Informational 1xx]
100="Continue"
101="Switching Protocols"

[Successful 2xx]
200="OK"
201="Created"
202="Accepted"
203="Non-Authoritative Information"
204="No Content"
205="Reset Content"
206="Partial Content"

[Redirection 3xx]
300="Multiple Choices"
301="Moved Permanently"
302="Found"
303="See Other"
304="Not Modified"
305="Use Proxy"
306="(Unused)"
307="Temporary Redirect"

[Client Error 4xx]
400="Bad Request"
401="Unauthorized"
402="Payment Required"
403="Forbidden"
404="Not Found"
405="Method Not Allowed"
406="Not Acceptable"
407="Proxy Authentication Required"
408="Request Timeout"
409="Conflict"
410="Gone"
411="Length Required"
412="Precondition Failed"
413="Request Entity Too Large"
414="Request-URI Too Long"
415="Unsupported Media Type"
416="Requested Range Not Satisfiable"
417="Expectation Failed"

[Server Error 5xx]
500="Internal Server Error"
501="Not Implemented"
502="Bad Gateway"
503="Service Unavailable"
504="Gateway Timeout"
505="HTTP Version Not Supported"



Редиректы в Apache (.htaccess)

Код

Options +FollowSymLinks
RewriteEngine on
RewriteCond {HTTP_HOST} ^yourdomain.com
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=permanent,L]


Код

Redirect 301 / http://www.yourdomain.com/

Релевантные посты...

Related Posts with Thumbnails