php – Блог Stafox'a https://stafox.cc О программировании и веб-разработке Wed, 21 Sep 2016 07:13:34 +0000 en-US hourly 1 https://wordpress.org/?v=5.8.2 Как настроить Xdebug в PhpStorm https://stafox.cc/how-to-configure-xdebug-in-phpstorm/ https://stafox.cc/how-to-configure-xdebug-in-phpstorm/#comments Tue, 20 Sep 2016 17:51:19 +0000 http://stafox.ru/?p=2816 Речь пойдет о том, как подружить IDE PhpStorm и Xdebug, чтобы мы могли дебажить не только наши веб-странички и api, а также и консольные скрипты прямо из любимого IDE. Ранее я уже писал о установке и настройке Xdebug и работе с ним через IDE NetBeans. Поэтому если у Вас еще не установлен Xdebug – установите.

Сообщение Как настроить Xdebug в PhpStorm появились сначала на Блог Stafox'a.

]]>
Речь пойдет о том, как подружить IDE PhpStorm и Xdebug, чтобы мы могли дебажить не только наши веб-странички и api, а также и консольные скрипты прямо из любимого IDE.

Ранее я уже писал о установке и настройке Xdebug и работе с ним через IDE NetBeans. Поэтому если у Вас еще не установлен Xdebug – установите.

Большинство статей и заметок я пишу на примере Ubuntu. Поэтому если Вы еще не используете данный дистрибутив, советую ознакомиться с руководством по установке Ubuntu.

Заходим в настройки проекта File → Settings или Ctrl+Alt+S
ps-xdebug-1

Переходим в раздел Languages & FrameworksPHPDebug
И указываем Debug port:
ps-xdebug-2

Обратите внимание на порт, я использую 9009 (если он у Вас занят, укажите любой свободный)

Не стоит использовать для Xdebug порт 9000 (по умолчанию), если Вы используете php-fpm. В таком случае порт будет занят процессом php-fpm и Xdebug работать не будет.

Не закрывая настроек переходим в раздел Languages & FrameworksPHPDebugDBGp Proxy.

В php.ini параметр xdebug.remote_handler должен иметь значение dbgp.

И указываем следующие параметры:

IDE key: phpstorm

В php.ini параметр xdebug.idekey должен быть равен phpstorm.

Host: 127.0.0.1

В php.ini параметр xdebug.remote_host также должен быть 127.0.0.1.

Port: 9009

В php.ini параметр xdebug.remote_port должен быть 9009.

Все. На этом настройка завершена. Теперь для того, чтобы дебажить Вам достаточно поставить break-point и включить слушателя debug-соединений.
ps-xdebug-4

Сообщение Как настроить Xdebug в PhpStorm появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/how-to-configure-xdebug-in-phpstorm/feed/ 11
Warning: Erroneous data format for unserializing ‘App\UserBundle\Entity\User’ https://stafox.cc/warning-erroneous-data-format-for-unserializing-app-userbundle-entity-user/ https://stafox.cc/warning-erroneous-data-format-for-unserializing-app-userbundle-entity-user/#comments Sun, 20 Mar 2016 20:35:20 +0000 http://stafox.ru/?p=2776 Ошибка Doctrine 2 с FOS\UserBundle. Воспроизводится на PHP 5.6 при использовании FOS/UserBundle для Symfony и старой версии доктрины 2.3.х. Лог такой: Warning: Erroneous data format for unserializing 'App\UserBundle\Entity\User' in project/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php Я нашел два способа исправления. Обновить версию Doctrine Обновить Doctrine до версии 2.4.x или выше. Однако не всегда это допустимо, в силу того, что что-нибудь

Сообщение Warning: Erroneous data format for unserializing ‘App\UserBundle\Entity\User’ появились сначала на Блог Stafox'a.

]]>
Ошибка Doctrine 2 с FOS\UserBundle. Воспроизводится на PHP 5.6 при использовании FOS/UserBundle для Symfony и старой версии доктрины 2.3.х.

Лог такой:


Warning: Erroneous data format for unserializing 'App\UserBundle\Entity\User' in project/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php

Я нашел два способа исправления.

Обновить версию Doctrine

Обновить Doctrine до версии 2.4.x или выше. Однако не всегда это допустимо, в силу того, что что-нибудь может отвалиться. А исправить нужно здесь и сейчас 🙂

Изменить способ создания объекта без конструктора

Собственно причина проблемы – это способ, который использует Doctrine для создания объекта без вызова конструктора – десериализация данных.
Можно исправить метод newInstance() и создавать объект через рефлексию.


function newInstance()
{
    if ($this->_prototype === null) {
        if (method_exists($this->reflClass, 'newInstanceWithoutConstructor')) {
            $this->_prototype = $this->reflClass->newInstanceWithoutConstructor();
        } else {
            $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));
        }
    }

    return clone $this->_prototype;
}

Сообщение Warning: Erroneous data format for unserializing ‘App\UserBundle\Entity\User’ появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/warning-erroneous-data-format-for-unserializing-app-userbundle-entity-user/feed/ 1
Symfony 2: парсинг UTF-8 данных с DomCrawler https://stafox.cc/symfony-2-parse-utf-8-data-using-domcrawler/ https://stafox.cc/symfony-2-parse-utf-8-data-using-domcrawler/#respond Sun, 11 Oct 2015 18:27:13 +0000 http://stafox.ru/?p=2678 На днях необходимо было распарсить ресурс в рамках проекта на Symfony 2. Для этого я решил воспользоваться Сrawler’ом – компонентом Symfony, который позволяет работать с DOM элементами, используя при этом XPath и CSS фильтры. Но возникла проблема с кодировкой. Некоторые символы выглядели явно не так, как должны были, несмотря на то, что везде где можно

Сообщение Symfony 2: парсинг UTF-8 данных с DomCrawler появились сначала на Блог Stafox'a.

]]>
На днях необходимо было распарсить ресурс в рамках проекта на Symfony 2. Для этого я решил воспользоваться Сrawler’ом – компонентом Symfony, который позволяет работать с DOM элементами, используя при этом XPath и CSS фильтры. Но возникла проблема с кодировкой.

Некоторые символы выглядели явно не так, как должны были, несмотря на то, что везде где можно использовалась кодировка UTF-8. Дело в том, что Crawler использует кодировку ISO-8859-1 в том случае, если он не смог ее определить по мета-тегу


<meta charset="utf-8">

Исправить проблему можно воспользовавшись методом addHtmlContent(), который вторым параметром принимает кодировку (по умолчанию – UTF-8).

Поэтому вместо


use Symfony\Component\DomCrawler\Crawler;
...
$crawler = new Crawler($html);

нужно использовать


use Symfony\Component\DomCrawler\Crawler;
...
$crawler = new Crawler();
$crawler->addHtmlContent($html);

Сообщение Symfony 2: парсинг UTF-8 данных с DomCrawler появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/symfony-2-parse-utf-8-data-using-domcrawler/feed/ 0
Как получить количество лайков c Facebook Graph API v2 https://stafox.cc/how-to-get-page-likes-using-facebook-graph-api-v2/ https://stafox.cc/how-to-get-page-likes-using-facebook-graph-api-v2/#respond Fri, 07 Aug 2015 20:48:18 +0000 http://stafox.ru/?p=2603 Facebook запустил Graph API v2.0, а 30 апреля 2015 года прекратил поддержку версии v1.0. Мне понадобилось вытянуть количество лайков для страницы. Делюсь способом как это можно сделать. Вам понадобится OAuth2 access token для получения данной информации. Как его получить читайте документацию. $facebookPageId = 'pageNameOrId'; $accessToken = 'OAuthAccessToken'; /** * You may also add another fields

Сообщение Как получить количество лайков c Facebook Graph API v2 появились сначала на Блог Stafox'a.

]]>
Facebook запустил Graph API v2.0, а 30 апреля 2015 года прекратил поддержку версии v1.0. Мне понадобилось вытянуть количество лайков для страницы. Делюсь способом как это можно сделать.

Вам понадобится OAuth2 access token для получения данной информации. Как его получить читайте документацию.


$facebookPageId = 'pageNameOrId';
$accessToken = 'OAuthAccessToken';
/**
 * You may also add another fields to get (link, name, website and other)
 * @see https://developers.facebook.com/docs/graph-api/reference/page
 */
$fields = implode(',', array('likes'));
$url = "https://graph.facebook.com/v2.4/{$facebookPageId}?fields={$fields}&access_token={$accessToken}";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($curl);
curl_close($curl);
$details = json_decode($result);
echo $details->likes;

Application Access Token

Если Вы будете делать запрос от имени приложения, то можно получить данные, сделав всего один запрос к Graph API.
Дело в том, что Facebook Graph API v2 позволяет в качестве access token использовать пару appId и appSecret, разделив их |.
В таком случае url будет выглядеть следующим образом:


/**
 * @see https://developers.facebook.com/docs/facebook-login/access-tokens#apptokens
 */
$url = "https://graph.facebook.com/v2.4/{$facebookPageId}?fields={$fields}&access_token={$appId}|{$appSecret}";

Сообщение Как получить количество лайков c Facebook Graph API v2 появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/how-to-get-page-likes-using-facebook-graph-api-v2/feed/ 0
Ошибка ‘Cannot redeclare class’ при запуске теста PHPUnit https://stafox.cc/cannot-redeclare-class-error-in-phpunit-test/ https://stafox.cc/cannot-redeclare-class-error-in-phpunit-test/#respond Mon, 03 Aug 2015 20:24:51 +0000 http://stafox.ru/?p=2560 Как избавиться от ошибки ‘Cannot redeclare class’ при выполнение теста PHPUnit? Разберем причины и способы устранения. Ошибка подобного рода может возникать когда при выполнении набора тестов один из классов определяется более 1 раза. Такое может возникнуть при выполнении интеграционных тестов. Рассмотрим пример простого интеграционного теста на Zend Framework: public function testValidateUserSuccess() { $this->getRequest() ->setMethod('POST') ->setPost(array('username' =>

Сообщение Ошибка ‘Cannot redeclare class’ при запуске теста PHPUnit появились сначала на Блог Stafox'a.

]]>
Как избавиться от ошибки ‘Cannot redeclare class’ при выполнение теста PHPUnit? Разберем причины и способы устранения.

Ошибка подобного рода может возникать когда при выполнении набора тестов один из классов определяется более 1 раза. Такое может возникнуть при выполнении интеграционных тестов.

Рассмотрим пример простого интеграционного теста на Zend Framework:


public function testValidateUserSuccess()
{
    $this->getRequest()
        ->setMethod('POST')
        ->setPost(array('username' => 'test', 'msisdn' => '375291234567'));

    $this->dispatch('/api/user/validate');
    $this->assertResponseCode(200);
}

public function testValidateUserFailure()
{
    $this->getRequest()
        ->setMethod('POST')
        ->setPost(array('username' => 'test', 'msisdn' => 'abc'));

    $this->dispatch('/api/user/validate');
    $this->assertResponseCode(400);
}

При выполнении данного набора тестов приложение будет запущено дважды, а значит дважды ининицализируются все методы Bootstrap‘а и Autoloader.
Один из вариантов решения – это запуск теста в отдельном процессе. Для этого необходимо добавить перед тестом @runInSeparateProcess.


/**
 * @runInSeparateProcess
 */
public function testValidateUserSuccess()
{
    ...
}

/**
 * @runInSeparateProcess
 */
public function testValidateUserFailure()
{
    ...
}

Можно запустить каждый тест в отдельном процессе, указав перед классом теста @runTestsInSeparateProcesses


/**
 * @runTestsInSeparateProcesses
 **/
class UserTest extends PHPUnit_Framework_TestCase
{
    public function testValidateUserSuccess()
    {
        ...
    }

    public function testValidateUserFailure()
    {
        ...
    }
}

Подводные камни

Во время запуска тестов я периодически ловил ошибку


RuntimeException: PHP Fatal error:  Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed' in -:36

Полный текст ошибки


PHPUnit 3.6.10 by Sebastian Bergmann.

Configuration read from /path/to/project/tests/phpunit.xml

E

Time: 0 seconds, Memory: 4.50Mb

There was 1 error:

1) UserTest::testValidateUserSuccess
RuntimeException: PHP Fatal error:  Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed' in -:36
Stack trace:
#0 -(36): serialize(Array)
#1 -(135): __phpunit_run_isolated_test()
#2 {main}
  thrown in - on line 36

Гуглил, нашел пару предположений:

  • PHPUnit пытается все сложить в переменную $GLOBALS и ошибка возникает когда в тесте есть замыкания. Фикс: не использовать замыкания. Не мой вариант – у меня замыканий не было.
  • Причина @runInSeparateProcess. Фикс: не используйте @runInSeparateProcess. Однозначно тоже не мой вариант.

Не сумев найти решения на просторах интернета, я решил обновить PHPUnit с 3.6.10 => 4.7.7 – помогло 🙂
P.S. совместимость Zend Framework 1.12.13 с PHPUnit 4.7 нормальная (несмотря на заявленную поддержку 3.7).

Сообщение Ошибка ‘Cannot redeclare class’ при запуске теста PHPUnit появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/cannot-redeclare-class-error-in-phpunit-test/feed/ 0
Composer ничего не выводит https://stafox.cc/composer-show-nothing/ https://stafox.cc/composer-show-nothing/#respond Mon, 30 Mar 2015 20:08:24 +0000 http://stafox.ru/?p=2435 Проблема: composer ничего не выводит в ответ на любые команды. В моем случае проблема в расширении php – suhosin. В сорсах у composer есть следующий код: [php] if (extension_loaded(‘suhosin’)) { $suhosin = ini_get(‘suhosin.executor.include.whitelist’); $suhosinBlacklist = ini_get(‘suhosin.executor.include.blacklist’); if (false === stripos($suhosin, ‘phar’) && (!$suhosinBlacklist || false !== stripos($suhosinBlacklist, ‘phar’))) { $errors[‘suhosin’] = $suhosin; } } [/php]

Сообщение Composer ничего не выводит появились сначала на Блог Stafox'a.

]]>
Composer: No output
Проблема: composer ничего не выводит в ответ на любые команды.

В моем случае проблема в расширении php – suhosin.
В сорсах у composer есть следующий код:

[php] if (extension_loaded(‘suhosin’)) {
$suhosin = ini_get(‘suhosin.executor.include.whitelist’);
$suhosinBlacklist = ini_get(‘suhosin.executor.include.blacklist’);
if (false === stripos($suhosin, ‘phar’) && (!$suhosinBlacklist || false !== stripos($suhosinBlacklist, ‘phar’))) {
$errors[‘suhosin’] = $suhosin;
}
}
[/php]

Исправить просто: достаточно добавить phar в белый список suhosin.

[shell] suhosin.executor.include.whitelist = phar
[/shell]

Но для того, чтобы что-то исправлять, необходимо узнать в чем именно проблема. Для этого можно воспользоваться командой

curl -s https://getcomposer.org/installer | php — –check

Если все в порядке, вы увидите

curl -s https://getcomposer.org/installer | php — –check
All settings correct for using Composer

А если проблемы имеются – они будут указаны

curl -s https://getcomposer.org/installer | php — –check

Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The suhosin.executor.include.whitelist setting is incorrect.
Add the following to the end of your `php.ini` or suhosin.ini (Example path [for Debian]: /etc/php5/cli/conf.d/suhosin.ini):

suhosin.executor.include.whitelist = phar

Сообщение Composer ничего не выводит появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/composer-show-nothing/feed/ 0