Показаны сообщения с ярлыком PHP. Показать все сообщения
Показаны сообщения с ярлыком PHP. Показать все сообщения

среда, 14 августа 2013 г.

Работа со временем и датами в PHP

Для работы со временим и датами в PHP 5.2 и выше существует класс DateTime. Он заменяет функционал старых функций для работы со времением/датами.
Чтобы получить текущую дату/время нужно создать объект DateTime без передачи ему параметров.

$now = new DateTime(); 

Для получения объекта DateTime из строки содержащей время существует статический метод createFromFormat(string $format, string $time). Первый параметр - формат передаваемой даты/времени. Второй параметр - строка содаржащая дату/время в формате, переданном в первом параметре %)

Формат даты/времени может выглядеть например так:

Y-m-d H:i:s

что означает запись например такого вида:

2009-02-15 15:16:17.

В приведенной выше строке формата латинские буквы означают следующее:

  • Y -- запись года четырьмя цыфрами (например 2013);
  • m -- запись месяца двумя цыфрами с 01 по 12 (например 07);
  • d -- день месяца двумя цыфрами с 01 по 31;
  • H -- запись часа в 24-ох часовом формате двумя цыфрами с 00 до 23;
  • i -- минуты с нулем в начале;
  • s-- секунды с нулем в начале.

Существуют так же следующие символы формата даты/времени:

  • D и l -- текстовое представление дня месяца (От Mon до Sun либо от Sunday до Saturday);
  • z -- номер дня с начала года;
  • F и M -- текстовое представление месяца, например January или Sept;
  • y -- 2 цифровое представление года (например 03 -- это 2003 год);
  • a и A -- до полудня и После полудня (am или pm);
  • g и h -- 12-ти часовой формат времени с первым нулем или без него.

Для обратного преобразования объекта DateTime в строку существует метод format(string $format). В качестве параметра принимает строку с форматом даты/времени (таким же как в методе createFromFormat).

Для того чтобы вычесть или добавить в дате/времени какой-либо интервал времени (например 2 часа или 3 месяца), нужно воспользоваться методом add(DateInterval $interval) или sub(DateInterval $interval). ВАЖНО: Преобразование применяется к объекту для которого вызавается метод. В качестве параметров эти методы принимают объект класса DateInterval.

В качестве параметра конструктор этого класса принимает строку с интревалом времени в формате из спецификации ISO 8601. В соответсвии с ней: строка с интервалом времени начинается с латинсткой буквы P. Длина каждого периода описывается целым значением и следующим за ним указателем периода. Если длина периода содержит время, то его описанию должна предшествовать буква T. Например 2 дня записываются так -- P2D. Две секунды -- PT2S. Допустимы следующие обозначения интервалов:

  • Y -- года;
  • M -- месяцы;
  • D -- дни;
  • W -- недели;
  • H -- часы;
  • M -- минуты;
  • S -- секунды.

Помимо конструктора создать объект интервала времени можно с помощью статического метода DateInterval::createFromDateString(string $time). Он принимает в качестве параметра строку с интервалом времени в более читаемом виде. Например:
1 day
2 weeks
3 months
и даже
1 year + 1 day
1 day + 12 hours.


Таким образом благодаря классу DateTime работа с датами и временем в PHP не вызывает сложностей.

вторник, 4 июня 2013 г.

Встроенный web-сервер в PHP

В PHP начиная с версии 5.4 встроен Web сервер. Запустить его очень легко:
  1. Открываем терминал.
  2. Переходим в директорию в которой находятся скрипты, доступ к которым должен предоставить web сервер.
  3. Выполняем команду:
    php -S хост:порт
Если в качестве хоста прописать localhost, то доступ к серверу будут иметь только локальные клиенты.

четверг, 28 марта 2013 г.

Yahoo Web Mail Service

На работе интернет только через прокси + закрыты все порты, кроме 80 и 433. А нужно было протестировать механизм регистрации на разрабатываемом сайте (с отправкой сообщения пользователю на мыло). Единственное что пришло в голову, это найти сервис электронной почты с открытым API и использовать его для отправки сообщений. Погуглив, нашел только на yahoo.com такой API. Вот тут его описание.
Для работы с Yahoo Web Mail Service, нужно:
  • Завести аккаунт на Yahoo.com.
  • Зайти на страницу управления вашими проектами и создаем новый. Проект - это сущность, которая является "учетной записью" вашего проекта на сервере Yahoo. Каждый проект имеет Consumer Key и Consumer Secret, по которым и осуществляется доступ к API.
  • Скачать здесь PHP-библиотеку для работы с Yahoo Web Mail Service и поместить её в директорию сайта.
  • Ниже приведен исходный код скрипта для работы с API:
    require_once 'ymclient.php';
    
    define('OA_CONSUMER_KEY', '****************************************************************************************************');
    define('OA_CONSUMER_SECRET', '****************************************');
    define('OA_CALLBACK_URL', 'http://localhost/');
    define('REQUEST_TOKEN_COOKIE_NAME', 'rt');
    define('ACCESS_TOKEN_COOKIE_NAME', 'at');
    
    $ymc = new YMClientRequest(OA_CONSUMER_KEY, OA_CONSUMER_SECRET,
     OA_CALLBACK_URL, '192.168.60.3:3128');
    
    header("Content-type: text/plain\r\n\r\n");
    message = new stdclass();
    $msg->message->subject = 'Test from Yahoo!';
    $msg->message->from = new stdclass();
    $msg->message->from->email = '*******@yahoo.com';
    $msg->message->to = new stdclass();
    $msg->message->to->email = '******@gmail.com';
    $msg->message->simplebody = new stdclass();
    $msg->message->simplebody->text = 'Hello, World!';
    if ($ymc->SendMessage($msg)===false)
     echo 'error';
    else
     echo 'ok';
    
    class YMClientRequest {
        function __construct($oaConsumerKey, $oaConsumerSecret, $callbackURL,
          $proxy=null) {
            $this->oaConsumerKey = $oaConsumerKey;
            $this->oaConsumerSecret = $oaConsumerSecret;
            $this->callbackURL = $callbackURL;
            $this->ymc = new YMClient($oaConsumerKey, $oaConsumerSecret, $proxy);
        }
        function __call($method, $arguments) {
            $tok = $this->__get_access_token();            
            $result = $this->ymc->$method($arguments, $tok);
            $newtok = $this->ymc->oauth_get_refreshed_token();
            if($newtok) {
                setcookie(ACCESS_TOKEN_COOKIE_NAME, 
                    YMClient::oauth_token_to_query_string($newtok));
            }
            return $result;
        }
        private function __get_access_token() {
            // Access token exists in a cookie
            if(isset($_COOKIE[ACCESS_TOKEN_COOKIE_NAME])
                && $_COOKIE[ACCESS_TOKEN_COOKIE_NAME]) {
                parse_str($_COOKIE[ACCESS_TOKEN_COOKIE_NAME], $tok);                
                return $tok;
            }
            // Handling a redirect back from login
            else if(isset($_COOKIE[REQUEST_TOKEN_COOKIE_NAME])
                && $_COOKIE[REQUEST_TOKEN_COOKIE_NAME]
                && isset($_REQUEST['oauth_verifier'])
                && $_REQUEST['oauth_verifier'] 
                && isset($_REQUEST['oauth_token'])
                && $_REQUEST['oauth_token']) {
    
                $tok = YMClient::oauth_token_from_query_string(
                    $_COOKIE[REQUEST_TOKEN_COOKIE_NAME]);
    
                if($tok['oauth_token'] != $_REQUEST['oauth_token'])
                    throw new Exception("Cookie and URL disagree "
                        ."about request token value");
    
                $tok['oauth_verifier'] = $_REQUEST['oauth_verifier'];                            
                $newtok = $this->ymc->oauth_get_access_token($tok);
    
                setcookie(REQUEST_TOKEN_COOKIE_NAME, "", time()-3600);
                setcookie(ACCESS_TOKEN_COOKIE_NAME,
                    YMClient::oauth_token_to_query_string($newtok));
                return $newtok;
            }
            else {
                list ($tok, $url) = $this->ymc->oauth_get_request_token(
                    $this->callbackURL);
                setcookie(REQUEST_TOKEN_COOKIE_NAME,
                    YMClient::oauth_token_to_query_string($tok));
                header("Location: $url");
            }
        }
    }
    
    В приведенном выше фрагменте используется прокси для подключению с API. Изначально библиотека этого не предусматривала, поэтому её пришлось несколько модифицировать. Исходный код модифицированной версии можно скачать здесь. Этот фрагмент отправляет электронное сообщение, что и требовалось.
Интересные факты(:
  • Аутентификация осуществляется через OAuth.

пятница, 15 марта 2013 г.

Установка и настройка PHPUnit. Настройка PhpStorm

Установка PHPUnit

Установить PHPUnit можно через PEAR командой:
pear channel-discover pear.phpunit.de
pear install --alldeps phpunit/PHPUnit
Так же может потребоваться установка PHPUnit_Selenium. Но перед этим нужно добавить канал pear.symfony.com, т. к. PHPUnit_Selenium использует Symfony2 Yaml Component. Добавляется канал командой:
pear channel-discover pear.symfony.com
После этого можно устанавливать PHPUnit_Selenium:
pear install --alldeps phpunit/PHPUnit_Selenium

Настройка PhpStorm

PHPUnit в PhpStorm не требует каких-либо дополнительных настроек, главное чтобы в настройках Settings->PHP->Include path был путь к директории PEAR.

Установка и настройка PEAR

  1. Скачать PEAR http://pear.php.net/go-pear.phar.
  2. Скопировать его в отдельную папку, например c:\utils\pear.
  3. Выполнить команду php go-pear.phar.
  4. Во время установки PEAR спросит где Вы хотите сохранить конфигурационные файлы: system - в C:\Windows, local - в папке PEAR'а.
  5. Так же он спросит место расположения PHP, т. к. дописывает свой путь в include_path. Пусть к PEAR можно дописать в php.ini и после установки:
    ;***** Added by go-pear
    include_path=".;C:\utils\pear\pear"
    ;*****
  6. Послу установки можно добавить нужные каналы:
    pear channel-discover pear.phpunit.de
    pear channel-discover pear.symfony.com
    
  7. После этого можно устанавливать пакеты командой:
    pear install --alldeps phpunit/PHPUnit
    

О том как настраивать PEAR с помощью переменных окружения написано тут.

четверг, 14 марта 2013 г.

Настройка PEAR

Возникли сложности с настройкой параметров PEAR, посмотреть их можно вызвав команду:

pear config-show

Настройки можно задать через переменные окружения:

PHP_PEAR_MASTER_SERVER - master_server
PHP_PEAR_HTTP_PROXY    - http_proxy
PHP_PEAR_INSTALL_DIR   - php_dir
PHP_PEAR_EXTENSION_DIR - ext_dir
PHP_PEAR_DOC_DIR       - doc_dir
PHP_PEAR_BIN_DIR       - bin_dir
PHP_PEAR_DATA_DIR      - data_dir
PHP_PEAR_CFG_DIR       - cfg_dir
PHP_PEAR_WWW_DIR       - www_dir
PHP_PEAR_TEST_DIR      - test_dir
PHP_PEAR_TEMP_DIR      - temp_dir
PHP_PEAR_CACHE_DIR     - cache_dir
PHP_PEAR_DOWNLOAD_DIR  - download_dir
PHP_PEAR_PHP_BIN       - php_bin
PHP_PEAR_SYSCONF_DIR   - папка где находятся pear.ini и pearsys.ini.

Задавая эти параметры можно вообще не пользоваться командой pear config-set.

пятница, 4 мая 2012 г.

Apache + PHP + PostgreSQL

В Windows может быть недостаточно подключить к PHP расширение php_pgsql.dll для того чтобы коннект к базе работал. В случае если при попытке подключиться в PostgreSQL, PHP выдает одну из следующих ошибок:
  • Call to undefined function pg_connect();
  • PDOException: could not find driver,
убедитесь что правильно настроили расширение php_pgsql:
  • добавили или раскоменторовали строки extension=php_pgsql.dll и extension=php_dbo_pgsql.dll в файле php.ini;
  • перезагрузке веб-сервер.
Проверьте выводит ли информацию о расширении phpinfo(), если нет - расширение не загрузилось.
В этом случае в конфигурационный файл httpd.conf нужно добавить строку:
LoadFile "C:\Program Files\PostgreSQL\9.1\bin\libpq.dll"
и перезагрузить веб-сервер.

суббота, 31 марта 2012 г.

Массивы PHP и SplFixedArray

Оказывается, под любой элемент массива в PHP выделяется 144 байта. Почему, написано в этой статье http://habrahabr.ru/post/141093/. Для того чтобы сэкономить оперативную память при работе с большими массивами, можно использовать класс SplFixedArray. При использовании этого класса, можно экономить 88 байт на элемент (под каждый элемент выделяется всего 56 байт:).

четверг, 13 октября 2011 г.

Определение кодировки текста в PHP

Функции имеющиеся по умолчанию в PHP не всегда верно определяют кодировку текста, (только в 70% случает). Но существуют сторонние библиотеки которые решают эту задачу на много лучше:
charset_x_win -- библиотека, для преобразования строк на русском языке из неизвестной кодировки в кодировку windows-1251. Оптимизирована для работы с короткими строками. Скачать библиотеку можно тут http://popoff.donetsk.ua/text/work/libs/a/charset/.

Интересные статьи по методам определения кодировки:
http://ivr.webzone.ru/articles/alt_win/index.htm
http://ivr.webzone.ru/articles/defcod_2/index.htm