Все еще используете Denwer? Пора попробовать Open Server!

Сразу сделаю оговорку для тех, кто использует для web-разработки среду *NIX — конечно, это намного логичнее разрабатывать на том, на чем и будет работать. Спору нет.

Ну а тем кто все же не покинул мир Windows :) да и еще разрабатывает с помощью этой платформы сайты, пора пересмотреть свой пакет приложений. Например вместо Denwer почему бы не попробовать Open Server, который, кстати, стартовал уже довольно давно — летом 2010. За это время он обрел версию 5.2.6. А количество скачиваний перевалило за миллион. Вобщем проект устоявшийся и к тому же очень функциональный.

настройка Open Server

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

Кстати, если вы хотите вести разработку на PHP 7, то здесь Open Server не заменим. Denwer уже порядком устарел — в последней версии на данный момент доступен лишь PHP 5.3. Вобщем, как ни хорош был когда то Denwer, кажется ему пришла достойная замена.

1062: Duplicate entry ’2147483647′ for key ‘PRIMARY’ или Проблема 2038 года

Наверное помните раскрученную проблему 2000? А все из-за того что кто-то заранее не подумал о том что будет через каких то 30 лет и использовал в программном обеспечении 2-ух значное обозначение года. И надо сказать, что проблема 2000 не единственная в своем роде. Наверное еще рановато об этом говорить, но назревает еще и проблема 2038 года. Поясню что имеется в виду. Попробуйте запустить следующий PHP-код:

1
<?php echo date("d.m.Y H:i", 2147483647); ?>

На выходе получим: 19.01.2038 06:14. А теперь увеличьте число на 1. Получилось 13.12.1901 23:15 что не соответствует истине. А все потому что метка времени UNIX при этом выходит за рамки диапазона типа данных Integer.

Хотя проблема 2038 года — это конечно больше шутка. Но однажды при записи данных в MySQL базу данных я получил ошибку:

1062: Duplicate entry ’2147483647′ for key ‘PRIMARY’

Дело в том что для первичного ключа использовалось поле с типом данных INT. И так получилось, что AUTO INCREMENT вышел за пределы числа 2147483647, максимального для INT. Решение простое в данном случае — пришлось использовать тип данных BIGINT. Так что думайте сами, решайте сами …

Отображение количества просмотров поста в WordPress по данным Yandex.metrika

Вместо того чтобы создавать свою систему статистики для блога, почему бы не использовать уже готовую — например Yandex.metrika? Тем более что Yandex предоставляет свой API для доступа к статистике. Ниже приведен способ извлечения с Yandex.metrika и отображения количества просмотров для конкретного поста.

Первый шаг — регистрация приложения для доступа к статистике. Для этого авторизуемся в своем аккаунте метрики. Затем переходим по ссылке:
https://oauth.yandex.ru/client/new
И регистрируем приложение как указано на скриншоте.

yandex metrika

Второй шаг — узнаем ID своего приложения. Для этого идем сюда:
https://oauth.yandex.ru/client/my
Кликаем на названии своего приложения и копируем куда нибудь его ID.

Третий шаг — нужно получить токен для доступа к системе. Для этого выполняем следующий запрос, подставив ID приложения полученный на предыдущем шаге:

https://oauth.yandex.ru/authorize?response_type=token&client_id=[подставляем ID приложения]

Копируем токен, который понадобится скрипту для доступа к статистике. Кстати, для проверки правильности предыдущих шагов можно выполнить запрос вида:

http://api-metrika.yandex.ru/stat/content/popular?id=[номер счетчика метрики]&date1=[дата начала ГГГГММДД]&date2=[дата конца ГГГГММДД]&oauth_token=[токен]

Если вы увидите xml-файл с данными статистики, то все нормально.

Четвертый шаг — нужно добавить скрипт в WordPress. Создаем в корне сайта файл yml.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
// НАСТРОЙКИ
$startDate = ""; // дата с которой считать статистику в формате ГГГГММДД
$yandexMetrikaCounterID = ""; // № счетчика Yandex.metrika
$yandexMetrikaToken = ""; // токен
 
// инициализация
$ymDateLoad = 0;
 
// если xml-фаил метрики есть
if (file_exists($_SERVER['DOCUMENT_ROOT'].'/upload/ym.xml')) {
	$ymData = simplexml_load_file($_SERVER['DOCUMENT_ROOT'].'/upload/ym.xml');
	$ymDateLoad = $ymData->date2;
}
 
// если фаила метрики нет или он устарел
if ($ymDateLoad != date('Ymd')) {
	// создание нового cURL ресурса
	$ch = curl_init();
 
	// установка URL и других необходимых параметров
	curl_setopt($ch, CURLOPT_URL, "http://api-metrika.yandex.ru/stat/content/popular?id=".$yandexMetrikaCounterID."&date1=".$startDate."&date2=".date("Ymd")."&oauth_token=".$yandexMetrikaToken);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_HEADER, 0);
 
	// загрузка страницы
	$ymXml = curl_exec($ch);
 
	// завершение сеанса и освобождение ресурсов
	curl_close($ch);
 
	// обработка
	$ymXml = str_replace(array('<![CDATA[', ']]>', str_replace('www.', '', 'http://'.$_SERVER['HTTP_HOST'])), array('', '', ''), $ymXml);
 
	// запись в фаил
	$handle = fopen($_SERVER['DOCUMENT_ROOT']."/upload/ym.xml", "w");
	fwrite($handle, $ymXml);
	fclose($handle);
 
	// объект SimpleXML
	$ymData = simplexml_load_string($ymXml);
	$ymDateLoad = $ymData->date2;
}
 
if ($ymDateLoad) {
	// uri
	$uri = $_SERVER['REQUEST_URI'];
 
	// вывод
	foreach ($ymData->data->row as $row) {
		if ($uri!=$row->url) continue;
		echo $row->page_views." просмотров";
	}
}
?>

В самом начале кода в разделе настроек присваиваем значения 3-ём переменным. $startDate — дата начала статистики в формате ГГГГММДД (например 20130101). Логично поставить дату установки счетчика метрики на блоге. $yandexMetrikaCounterID — подставляем номер счетчика Yandex.metrika. Найти его можно здесь:

yandex metrika

$yandexMetrikaToken — сюда подставляем токен полученный на 3-ем шаге.

Пятый шаг — создаем папку для файлов кеша. Работать и без этого будет, конечно, но тогда каждый раз при отображении поста будет тратится лишнее время на подгрузку статистики с метрики. Итак, создаем в корне сайта папку upload и присваиваем ей права 777. Например в FileZilla это делается так:

yandex metrika

Шестой шаг — добавляем отображение количества просмотров в шаблон поста. В панели управления WordPress идем в Внешний вид -> Редактор и выбираем шаблон content-single.php. Вставляем следующий код:

<div><?php require_once($_SERVER['DOCUMENT_ROOT']."/ymc.php"); ?></div>

например, после заголовка поста, то есть после следующего кода:

<h1><?php the_title(); ?></h1>

Так же можно настроить стили, добавив в файл style.css, например, следующее:

.ymc {color:#218f48; font-weight:bold;}

В результате работы скрипта получим вот это:

yandex metrika


Так же интересно…
Потолок, а так же его правильное освещение, к примеру, с использованием люстры для спальни — может полностью изменить интерьер любого помещения, будь то офис или жилая комната.


Переход на PHP 5.4 и Fatal error: Call-time pass-by-reference has been removed in

Ошибка подобного вида может появится на сайте, если хостинг сам обновит PHP до версии 5.4. Особенно часто такие обновления «без спросу» делают бесплатные хостинги. На платных чаще всего самому пользователю предоставляется выбор версии PHP.

Как бы то ни было — вы сами обновили версию или это сделали без вашего ведома — некоторый несовместимый PHP-код нуждается в доработке.

Что требует PHP 5.4

Теперь указание знака амперсанда (&) перед переменной при вызове функции вызывает фатальную ошибку и, как следствие, остановку выполнения дальнейшего кода. В PHP 5.3 это вызывало лишь предупреждение, а сейчас стало все строже. Как вы наверное помните, амперсанд указывает на передачу аргумента по ссылке. Такая передача, естественно, возможна и в новой версии PHP, но указывать знак амперсанда теперь нужно только в определении функции. То есть, например, здесь все оставляем как было:

1
2
3
function userFunc(&$arg) {
  return $arg++;
}

А вот здесь амперсанд убираем:

1
userFunc(&$arg);

Должно быть только так:

1
userfunc($arg);

Очевидно, что это не все ограничения новой версии. Это лишь то, с чем я лично столкнулся.

Осторожнее с предупреждениями PHP!

Можно сделать вывод что предупреждения, которые выдает интерпретатор PHP, все же надо учитывать. Кто знает, что вызовет фатальную ошибку в следующей версии? Например в PHP 5.4 статический вызов функции класса, если в определении данной функции не указано слово static, вызывает предупреждение. Пример:

1
2
3
4
5
6
class userClass {
  public function userFunc(&$arg) {
    return $arg++;
  }
}
userClass::userFunc($arg);

Лучше доработать такой код сейчас, не дожидаясь фатальных ошибок в будущем. Добавляем ключевое слово static:

1
2
3
4
5
6
class userClass {
  public static function userFunc(&$arg) {
    return $arg++;
  }
}
userClass::userFunc($arg);

Так гораздо надежнее.

Hello world в jQuery AJAX

Начать использовать jQuery очень просто, а вместе с ним и AJAX, который также становится очень простым в этой связке. Смотрите пример ниже. Для простоты библиотека jQuery берется с сайта googleapis.com, но вы можете разместить ее и локально. Обратите внимание, что все файлы должны быть в кодировке UTF-8.

Итак, листинг ajax.html (это файл, который необходимо вызвать в браузере):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
</head>
<body>
  <div id="content"></div>
  <input id="show_btn" type="button" value="Показать"/>
  <input id="close_btn" type="button" value="Закрыть"/>
  <input id="pos_id" type="hidden" value="5"/>
  <script src="ajax.js" type="text/javascript"></script>
</body>
</html>

Далее листинг ajax.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$(document).ready(function(){ 
  $('#show_btn').click(function(){ 
    $.ajax({ 
      url: 'ajax_servlet.php', 
      data: 'id='+$('#pos_id').val(), 
      cache: false, 
      success: function(html){ 
        $('#content').html(html); 
      } 
    }); 
  }); 
  $('#close_btn').click(function(){ 
    $('#content').html(''); 
  });
});

Ну и наконец файл, отвечающий на AJAX-запрос на стороне сервера, ajax_servlet.php:

1
2
3
4
5
6
<?php
echo
  "Привет мир!<br/>".
  "Скрытый параметр id=".$_GET['id']
;
?>