Тэг ‘php’

Как запустить скрипты по Cron-у но без крона?

Если на хостинге нет CRON-а, а выполнять скрипты по расписанию нужно, можно пойти на “хитрости” (Вариант с переходом на другой хостинг/тариф/выделенный не рассматривается, поскольку слишком прост)

Прочитал у Never LEX-а (вообще, на блоге можно найти много интересного) статью про CRON для бедных - вспомнил, как сталкивался с аналогичной задачей. В общем-то, идея схожая - при открытии web-страницы проверяем время последнего выполнения скрипта (используем специальный файл) и, при необходимости, запускаем скрипт.

От варианта, предложенного Lex-ом мой а-ля cron отличают всего лишь несколько моментов:

В файл-счетчик времени ничего не пишется. Индикатором последнего старта скрипта является время последнего изменения файла (файл открыл “w+” и сразу закрыл). Информацию о времени изменения файла получаем функцией filemtime.

В случае, если скрипт запускается “надолго”, непосредственный include приводит к увеличению времени выполнения скрипта для некоторых посетителей. Чтобы этого избежать, была реализована следующая схема:

Для “длительных” запусков использовался вариант с подгрузкой изображения через javascript :
document.write('<'+'img src="cronimg.php" alt="" />');

Скрипт cronimg.php отдает прозрачный gif-пиксель 1×1, умирает и… продолжает выполнение уже без соединения с браузером. Все дело в использовании register_shutdown_function (’cron_function’) - в параметре передаем имя нашей cron-функции, которая и будет выполнять требуемые действия.

Note:      Working directory of the script can change inside the shutdown function under some web servers, e.g. Apache.

Если в функции требуется работать с файлами, лучше использовать абсолютные пути (например, с использованием dirname(__FILE__)) - т.к. рабочий каталог внутри функции может измениться.

* Если сайт не особо посещаем, то, возможно выполнение скрипта с задержкой. Используя вместо конструкции javascript  -> img простой фрейм/iframe, мы добавим к “посетителям” поисковых роботов… (хоть некоторые роботы и обрабатывают картинки и даже из скриптов, текстовых пауков всё равно больше)… Однако, если и роботы не особо посещают Ваш сайт, то о “надежности” такого CRON-а можно забыть.

Некоторые из описанных конструкций можно использовать и в случае “стороннего” cron-а: сторонний сервер (примеры можно посмотреть на страничке у Never Lex-а) обращается к нужному файлу с нужной периодичностью, а обработка происходит уже у нас на хостинге.

При запуске длительных скриптов нельзя упускать из вида ограничения на время выполнения скрипта… Однако, и в этом случае можно “пойти на хитрости”.. Пожалуй, это тема для отдельной статьи.

10 PHP-функций, которые Вы, вероятно, никогда не используете:
http://infinity-infinity.com/2009/07/10-php-functions-you-probably-never-use/

Опубликовано Август 19, 2010 | автор: levik  |  Комментарий (1) »

php скрипт - несколько превьюшек изображений в одном

Потребовалось выводить несколько превьюшек разных изображений в одном изображении. Небольшой php скрипт выводит 30 уменьшенных превьюшек прямоугольником.

define ('PIC_ROWS',5); // количество рядов в изображении
define ('PIC_COLS',6); // количество колонок в изображении
define ('PIC_WIDTH',20); // ширина одного изображения в большом
define ('PIC_HEIGHT',20); // высота изображения в
define ('PIC_PATH','images/'); // каталог изображений (на сервере)
$rows = array('image1.jpg','image2.jpg'); // массив с именами файлов
$i = 0;
$img = imagecreatetruecolor ( PIC_WIDTH*PIC_COLS, PIC_HEIGHT*PIC_ROWS );
imagefill($img, 0, 0, imagecolorallocate($img, 225, 225, 225)); // заполним цветом
for ($x = 0; $x<PIC_COLS;$x++)
 for ($y=0;$y<PIC_ROWS;$y++, $i++) {
  $file = PIC_PATH.$rows[$i];
$imginfo = getimagesize ($file); //([0]-width [1]-height)
$imgtmp = imagecreatefromjpeg($file);
imagecopyresampled ( $img , $imgtmp, $x*PIC_WIDTH , $y*PIC_HEIGHT , 0 , 0 , PIC_WIDTH , PIC_HEIGHT , $imginfo[0]  , $imginfo[1]);
imagedestroy ($imgtmp);
}
header("Content-type: image/jpeg");
imagejpeg($img);

На выходе получается “матрица” изображений “всё в одном”

Опубликовано Июль 26, 2010 | автор: levik  |  Нет комментариев »

SOAP в PHP -

В дистрибутив PHP 5  входит модуль SOAP. Однако, он не является обязательным. Для более ранних версий php (php 4) или, если модуль SOAP не подключен (и подключить его нет возможности) можно воспользоваться готовым классом.  (PEAR::SOAP, NuSOAP, eZ SOAP,Zend.soap)

http://phpclub.ru/detail/article/soap - одна из наиболее популярных статей по SOAP
http://habrahabr.ru/blogs/php/38370/
http://www.php.ru/manual/ref.soap.html - руководство по PHP SOAP (SOAP Functions)

При работе с nusoap могут возникнуть проблемы с русскими буквами (отправка запроса на сервер), если файлы сохраняются в кодировке windows 1251. Аналогичные файлы в кодировке UTF-8 работают без сбоев.

Пример написания собственного веб-сервиса:
http://php5.com.ua/blog/php-programming/53.html

Скачать:
NUSOAP - http://sourceforge.net/projects/nusoap/

Опубликовано Июль 22, 2010 | автор: levik  |  Нет комментариев »

PHP - функции регистра не работают strtolower, strtoupper, не работает uc_first

Функции strtolower, strtoupper, uc_first корректно преобразуют буквы английского алфавита, однако с русскими буквами не работают. Скорее всего, дело в кодировке.

1. если файлы в кодировке cp1251 пробуем установить соответствующую локаль:
setlocale(LC_ALL, ‘ru_RU.CP1251′);

Для файлов в кодировке UTF-8  следует использовать мультибайтовые функции mb_strtolower, mb_strtoupper… Однако, не каждый хостинг поддерживает mb-расширение.
$var = mb_strtolower($var,'UTF-8') // не забываем указать кодировку в функции mb_strolower, mb_strtoupper

2. Если установка локали не помогла, можно написать собственную функцию:

function my_strtolower ($string){
$str=strtolower($string);
if (strtolower ('Ц')!='ц') $string = strtr(
$string,
'АБВГДЕЁЖЗИЙКЛМНОРПСТУФХЦЧШЩЪЬЫЭЮЯ',
'абвгдеёжзийклмнорпстуфхцчшщъьыэюя');
return $string;
};

По аналогии, если требуется, можно написать собственные функции вместо strtoupper и uc_first

ps. На мой взгляд, все-таки лучше разобраться с настройками хостинга..

Опубликовано Июль 16, 2010 | автор: levik  |  Комментарий (1) »

php-шпаргалка

Шпаргалка php.

Пополняется

Вывод на php полного URL (протокол + адрес + путь + GET-строка)

<?=$_SERVER['SERVER_PROTOCOL']
.$_SERVER['SERVER_NAME']
. $_SERVER['REQUEST_URI ]
.$_SERVER[’QUERY_STRING] ?>

Порядок аргументов

int substr ( string $string , int $start [, int $length ] )
int strpos ( string $haystack , string $needle [, int $offset ] )

array explode ( string $separator , string $string [, int $limit ] )
string implode ( string $glue , array $pieces )

mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int $&count ] )

pathinfo() -> array_keys ( dirname, basename, extension);

Шпаргалка сбивается для собственных нужд, однако пополнения приветствуются…

Опубликовано Июнь 17, 2010 | автор: levik  |  Нет комментариев »

PHP, magic_quotes и экранирование кавычек (откуда берется слэш?)

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

Несмотря на то, что весь функционал magic_quotes упразднен, на сегодняшний день многие хостинг-компании предоставляют услуги с поддержкой более ранних версий PHP.

This feature has been DEPRECATED as of PHP 5.3.0.
… and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.

Многие скрипты не проверяют состояние флагов magic_quotes.. Кроме того, некоторые из них предполагают автоматическое экранирование спецсимволов (за что, как раз и отвечает отмененная директива).

Как быстро и без лишних усилий настроить (или сбросить) экранирование кавычек без использования magic_quotes?

Отключаем magic_quotes в PHP.ini

; Magic quotes для входных данных (GET/POST/Cookie).
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ‘ with ” instead of \’).
magic_quotes_sybase = Off

или в .htaccess

php_flag magic_quotes_gpc Off

Если же отключить magic_quotes по какой-либо причине не удается, можно воспользоваться функцией, которая “сбросит” экранирование в зависимости от текущего значения

function stripslashes_for_array(&$arr) {
 foreach($arr as $k=>$v) {
  if (is_array($v)) {
   stripslashes_for_array($v);
   $arr[$k] = $v;
  } else {
   $arr[$k] = stripslashes($v);
  }
 }
}
function fix_magic_quotes_gpc() {
 if (get_magic_quotes_gpc())  {
  stripslashes_for_array($_POST);
  stripslashes_for_array($_GET);
  stripslashes_for_array($_COOKIE);
 }
}
# Убираем экранирование в функциях $_GET, $_POST, $_COOKIE
if (function_exists ('get_magic_quotes_gpc')) // а есть ли смысл?
  fix_magic_quotes_gpc();

Опубликовано Июнь 9, 2010 | автор: levik  |  Нет комментариев »

php: разделитель пути к файлу - PATH_SEPARATOR и DIRECTORY_SEPARATOR

При переносе некоторых php-проектов c ОС windows на *nix (linux) иногда возникают сложности из-за некоторых различий этих операционных систем… Но кое-что разработчики PHP не оставили без внимания.

В Windows в пути файла для разделения каталогов используется символ ‘\’ (обратный слэш), в linux - символ ‘/’ (прямой слэш). В общем-то, в большинстве случаев и в windows допустимо использовать ‘/’ - все файлы, пути к которым прописаны в соответствии с Linux-обозначением (./tmp/file.txt) корректно распознаются в обеих системах. Однако, иногда может потребоваться явное указание разделителя пути.. и, чтобы при переносе не возникало сложностей, можно воспользоваться специально введенной php-константой DIRECTORY_SEPARATOR, которая принимает значение в зависимости от системы.

PATH_SEPARATOR может потребоваться при работе с include_path - список каталогов, в которых PHP в первую очередь ищет подключаемые файлы, если не находит их в текущем каталоге. В Windows каталоги разделяются символом ‘;’ , для Linux-систем разделителем является двоеточие (’:')

Константы-разделители позволяют не изменять код при переносе с windows на linux и обратно..

Опубликовано Май 23, 2010 | автор: levik  |  Комментарий (1) »

Warning: split() [function.split]: REG_EMPTY in…

Warning: split() [function.split]: REG_EMPTY in

Сообщение о такой ошибке в PHP чаще всего появляется при разборе функцией split строки, в которой используется символ, задающий границы регулярного выражения (ошибка, похоже означает что-то вроде “задано пустое REG-улярное выражение”) :

$to_split = “value1|value2″;
$values = split(”|”,$to_split );

Чтобы избежать ошибки REG_EMPTY при использовании PHP функции split(), следует экранировать символ “|” в строке-разделителе:

$values = split(”\|“,$string );

Опубликовано Май 15, 2010 | автор: levik  |  Комментарии (3) »

PHP - пасхальные яйца - fun

Пасхальные яйца в PHPПасхальными яйцами (Easter Eggs) называют “секреты” спрятанные от глаз пользователя и не связанные с основной идеей игры или программы.

Разработчиков PHP, вдохновение и чувство юмора тоже не обошло стороной. Достаточно передать специальные GET  параметры, чтобы “найти яичко” :)

любой_сценарий.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42

В зависимости от версии PHP-интерпретатора Вы сможете увидеть что-то из этого (заодно и проверить версию php :) ):

1. фотография Thies Arntzen (версии 4.1.2, 4.2.2)
2. фотография таксы (владелец Stig Bakken) (версии 4.3.2, 4.3.3, 4.3.8 — 4.3.10)
3. фотография чёрного терьера (владелец Zeev Suraski) (версии 4.3.11, 4.4.0 — 4.4.4, 5.1.0, 5.1.2)
4. фотография кролика (версии 4.3.1, 5.0.0, 5.0.3)
5. искажённый логотип PHP (последние версии)

Логотипы PHP и ZEND отображаются при следующих значениях:

любой_сценарий.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
любой_сценарий.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42

Кстати, существуют функции php_logo_guid для логотипа PHP и zend_logo_guid для логотипа Zend.

Чтобы увидеть список всех авторов PHP, вводим следующее значение:

любой_сценарий.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000

ps. Кстати, похоже, в компании Masterhost, с чувством юмора похуже. :) На хостинге (проверил парочку сайтов с разных серверов… на всякий случай) ни одного яйца PHP не найдено. :) А на вашем хостинге есть яйца?

Опубликовано Март 4, 2010 | автор: levik  |  Комментарий (1) »

open_basedir restriction in effect

Столкнулся с необычным проявлением ошибки open basedir restriction:

Warning: open_basedir restriction in effect.
File /path/to/file is not within the allowed path(s):
(/path/to/dir1:/path/to/dir2) in /path/to/dir/filename.php on line 385

Сообщение такого рода возникает при попытке обратиться к файлу, который расположен за пределами “разрешенных” для php каталогов. Настройки хостинга обычно не препятствуют открытию файлов в пределах “домашнего” каталога пользователя или корневого каталога сайта. Значение переменной php_value open_basedir изменяется в httpd.conf или в php.ini. В .htaccess значение open_basedir изменить нельзя!!!

Часто сообщение open_basedir restriction вызвано неправильной обработкой загруженных при помощи php файлов - использование функции copy, unlink, rename вместо правильного move_uploaded_file. Об особенностях использования функции move_uploaded_file более подробно можно прочитать тут

Однако, как оказалось, такая ошибка может возникать ещё и при использовании функции tempnam(string $dir, string $prefix), которая должна создавать временный файл в каталоге $dir, если же каталог не существует, то пытается создать этот файл во временном каталоге системы. Стоит также проверить каталог $dir на запись - в моем случае именно права на доступ к каталогу стали причиной ошибки open basedir restriction.

ps. обнаружил при работе с simple csv upload интернет-магазина на базе virtuemart

Опубликовано Февраль 5, 2010 | автор: levik  |  Комментарии (2) »