php

Проблема с c-client

Bug #29783 IMAP module problem.

Хозяйке на заметку: если под Linux RedHat у вас не собрался PHP с IMAP c-client, соберите его с модулем OpenSSL (ключ -​-open-ssl). Должно помочь. Удивляет то обстоятельство, что разработчики PHP явно знают как о существовании проблемы, так и методе её решения. Почему бы не написать об этом хоть где-нибудь?

Оставить комментарий

Хардлинки в WinXP

Я очень часто начинаю разрабатывать проект под Windows и заканчиваю — под Linux или freeBSD. Конечно, даже на уровне PHP, между этими группами операционных систем есть существенные различия. Обычно, они легко преодолеваются. В последнем проекте мне более всего не хватало функции link.

Поэкспериментировав с w32api и ffi, я понял, что этот путь — тупиковый. Побродив по поисковикам, я выяснил, что простейший выход — использовать в качестве заглушки утилиту fsutil из Windows XP. У неё есть параметр «hardlink create», позволяющий создавать ссылки.

if (PHP_OS == 'WINNT' && file_exists($_ENV['windir'].'\system32\fsutil.exe'))
{
    function link($target, $link)
    {
        $cmd = $_ENV['windir'].'\system32\fsutil.exe hardlink create';
        exec ($cmd.' "'.$link.'" "'.$target, $out, $ret);

        return !$ret;
    }
}

В случае, если вы будете использовать эту функцию в проекте, будьте осторожны — это всего лишь заглушка. Во-первых, одна ссылка создаётся примерно за 0.6 — 1сек, во-вторых, в ней нет проверки на наличие специальных символов в переменных $target и $link — если там попадётся кавычка, возникнет опасность внедрения вредоносного кода.

Оставить комментарий

WinAPI и PHP

Так случилось, что в PHP существует три модуля расширения — два для PHP4 и один для PHP5, позволяющих обращаться к Windows API. Способы их вызова различны, плюс ко всему, положение усугубляется тем, что модули расширения имеют одинаковые имена, документация есть только по первому из них, тогда как в комплект PHP включается второй.

Ниже — результат моей потребности выяснить как же это всё работает. Прежде всего стоит заметить, что w32api не работает с mod_php, если старая версия вызывает ошибку при попытке повторного вызова в то же child, то новая вызывает ошибку сразу. В режиме CGI и с PHP5 я таких экспериментов не проводил.

Итак, ниже — реализация функции link (hard link) для Windows NT. Под CLI пример работает как с PHP5, так и с PHP4. Конечно, для того, чтобы пример заработал, нужна файловая система, поддерживающая hard links. Под моей NTFS5 (Windows XP) ссылки ставятся.

// Written by Evgeny Stepanischev (aka BOLK)
if (PHP_OS == 'WINNT') {
    // Модуль расширения FFI для PHP5
    if (extension_loaded('ffi') || intval(PHP_VERSION) >= 5 && @dl('php_ffi.dll')) {
        function link($target, $link) {
            $api = & new ffi("[lib='kernel32.dll'] int " . "CreateHardLinkA( char *link, char *target, long *attr);");
            return (bool)$api->CreateHardLinkA($link, $target, NULL);
        }
    } else
    // Модуль расширения w32API для PHP4
    if (extension_loaded('w32api') || @dl('php_w32api.dll')) {
        // Старая версия модуля
        if (function_exists('w32api_register_function')) {
            if (!function_exists('CreateHardLinkA')) {
                @w32api_register_function('kernel32.dll', 'CreateHardLinkA', 'bool');
            }
            if (function_exists('CreateHardLinkA')) {
                function link($target, $link) {
                    return CreateHardLinkA($link, $target, NULL);
                }
            }
        } else {
            // Новая (примерно с версии PHP 4.3.0)
            function link($target, $link) {
                $api = & new win32;
                $api->registerfunction("bool CreateHardLinkA" . "(string &link, string &target) From kernel32.dll");
                return $api->CreateHardLinkA($link, $target);
            }
        }
    }
}

Оставить комментарий

Как повалить PHP

Статья «Top 10 ways to crash PHP». Язык — английский, но примеры, которые там приведены, поймёт любой PHP-программист. Кстати, первый из них я приводил на старой версии сайта. Интересно, все ли способы работают в PHP 5.

Оставить комментарий

GIF в GD

Веб-разработчикам должно быть интересно: некоторое время назад вышла новая версия GD — 2.0.28. Главная особенность новой версии — поддержка формата GIF (чтение и запись).

Как известно, поддержка GIF была удалена из GD ещё в версии 1.6 в связи с тем, что алгоритм LZW, используемый в GIF оказался патентованным. После истечения срока действия патента, GD снова поддерживает GIF.

Оставить комментарий

Недокументированная debug_zval_dump

Кстати, одна из недокументированных функций PHP:

void debug_zval_dump(mixed var) Dumps a string representation of an internal zend value to output

Например, «debug_zval_dump(true)» выдаёт: «bool(true) refcount(1)»

Оставить комментарий

Собачий баг

Нашёл сегодня баг в PHP:

<?
error_reporting(E_ALL ^ E_NOTICE);
if (!$a++) @include __FILE__; else error_reporting(0);

var_dump(error_reporting());
?>

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

Оставить комментарий

Бум!

Следующая программа на PHP вызывает ошибку в Kernel32.dll под Windows Apache и ошибку в Msvcrt.dll, если её запустить из-под интерпретатора.

<?
function Boom()
{
Boom();
};
Boom();
?>

6 комментариев

ob_gzhandler

Великая загадка функции PHP ob_gzhandler раскрыта. Я посмотрел исходный код PHP и вот что я увидел: второй параметр этой функции — это флаг, который разрешает или запрещает отправку заголовка и окончания сжатого потока. У файловых архивов, как правило есть заголовок и, иногда, некое информативное окончание (например, информация о контрольной сумме). Так как вызовов ob_start с ob_gzhandler у вас может быть несколько, а заголовок должен быть только один, этот параметр и предназначен для отсечения «лишних» данных.

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

14 комментариев

Win errs, ICQ 4 DOS, PHP arrays, Colorer, www

Ссылочка (страница больше не существует) на страницу с «недокументированными» кодами ошибок Windows. Страница на английском, но язык выражений настолько прост, что человек, привычный к англоязычными интерфейсам программ, прочтет их без проблем.

Наиболее понравившиеся перлы:

WinErr 001: Windows loaded — System in danger
WinErr 002: No Error — Yet
WinErr 009: Horrible bug encountered — God knows what has happene
WinErr 019: User error — Not our fault. Is Not! Is Not!
WinErr 01B: Illegal error — You are not allowed to get this error. Next time you will get a penalty for that.

Ссылочку прислал Макс Симонов.

Моя кошка в очередной раз завела Любовную Песнь Ко Всем Котам Мира. Песня любовная, но почему такая пошлая? Раз за разом, наполняя воздухом мощные легкие, моя кошка являет миру свою песнь. Витас отдыхает. Боже, дай мне силы вытерпеть это еще раз.

За предоставленную информацию спасибо кошке Брусничке

Как не странно, существуют еще люди, которые ходят в интернет из DOS. Видимо, где-то на Земле сохранились еще компьютеры, которые не работают ни под чем, кроме этой БГом забытой ОС.

Для таких людей существует Lynx под DOS, Arachne и… порт ICQ под DOS. У меня эта программа запускаться отказалась — потребовала установить загадочный «packet driver», где его взять я не знаю, видимо, если у вас настроен TCP/IP под DOS, этот драйвер у вас уже имеется.

Насколько я понял, бегло прочитав руководство, интерфейс у этого клона текстовый, как, например, у его Unix-собрата vICQ. Последний, кстати, весьма любопытен тем, что написан он на языке Perl, т. е. при желании его можно как угодно модифицировать.

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

Любопытная, для PHP-программистов, мысль пришла мне недавно в голову. Никогда не задумывались, почему некоторые люди инициализируют массивы явно, вызовом array(), а другие — неявно, присваиванием?

Какие бы причины не двигали теми и другими, но теперь я понимаю, что правы первые и не правы вторые. Как известно в PHP, как и в многих других языках, для выборки элемента из массива и символа из строки применяется одна и та же конструкция — квадратные скобки.

В Perl, например, это делается по-другому — для массивов используются все те же скобки, а для строк пользуются функцией substr, которая ко всему прочему умеет становиться lvalue

Казалось бы, где грабли? Грабли в инициализации. PHP, если вы ничего не меняли в файле настроек, умеет превращать параметры POST— и GET-запросов в переменные скрипта, которому этот запрос адресован. Таким образом, если я вызову некий скрипт с параметром, скажем, ?config=s переменная $config получит значение «s» и тип «строка».

Если далее в программе встретится участок кода, который, по идее, должен был бы работать так, как будто переменная $config является массивом, на деле он будет работать с этой переменной, как со строкой, т. е. конструкция

$config[user_dir] = "/home/www/users";

заменит значение первого символа строки, хранящейся в $config на символ / и, при следующем чтении этого значения, вызов $config[user_dir] вернет слэш, что, потенциально, позволит какому-нибудь кулхацкеру, в зависимости от того, чем занимается этот скрипт, скачивать какие-либо файлы на сервере или изменять их.

Многим давно уже кажется, что то, чем PHP часто привлекает веб-программистов — содержимое главы Variables from outside PHP руководства по PHP, часто на практике приносит больше вреда, чем пользы.

В умах созревает идея заставить разработчиков PHP по-умолчанию эту фичу отключать, а внешние значения выбирать через соответствующие массивы, тем более, что разработчики пошли нам всем навстречу и присвоили им в последних версиях языка альтернативные короткие имена, доступные, к тому, из функций без определения их как global.

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

Хорошая новость для тех, кто имеет прямой выход в интернет или возможность читать ньюсы через прокси. Вот тут, пока неопределенное, время будет размещаться форум этого сайта за что большое спасибо Владиславу Игнатенко.

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

Еще одна хорошая новость. На этот раз для поклонников FAR’a и Colorer’a. Хотя на страничке автора никаких анонсов не замечено, Colorer продолжается развиваться. Его страничка переехала на SourceForge и содержит уже два патча. Список изменений не анонсируется.

Ставятся оба патча один поверх другого, в соответствующие папки, после чего плагина надо будет удалить директорий bin. Патчи являются бетами, но, работая с ними уже две недели, я никаких глюков не обнаружил.

Картинка, ссылку на которую прислали мне по аське. Кто-нибудь видел два евро? Оно (она? он?) действительно так выглядит?

Кто придумал, что сайты обязаны начинаться с www? В последнее время есть тенденция изменения в лучшую сторону, но некоторые упорно не хотят сдаваться. DNS местной фирмы «Мелт», при попытке выкусить у их сайта www грустно сообщает, что IP адрес такого сервера он не знает.

Я тут подсчитал, что если открыть в браузере журнал Хакер по его адресу без «www», браузер пошлет серверу на 360 байт меньше, чем, если бы ссылка эти буквы содержала. Сейчас, сидя на двух мегабитах, мне от такой цифры делается смешно, но дома, на модеме 33600, который вечно сползает до 28800, с постоянными ретрейнами и speed shift, я начинаю тихо плакать в уголке.

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

Господа веб-мастера, заводя сайты, пожалуйста, вписывайте в DNS и веб-сервер, адреса и без этой злосчастной комбинации тоже, если вам не жалко тех, кто сидит на паршивом диал-апе, то подумайте хотя бы о тех, кто пытается продиктовать ваш адрес по телефону или прочитать по радио! «Дабл-ю, дабл-ю, дабл-ю» или «ве-ве-ве» понятности адресу не добавляют.

Всем удачных выходных! Пишите в ящик и в ньюсы!

Оставить комментарий

Парсим Лебедева, Emax, PHP 4.0.4

Артемий Лебедев и компания опубликовали язык своего заочно знаменитого Парсера. Непонятно, чем они так гордились? С точки зрения программиста — обычный предпроцессор, тот же PHP — гораздо логичнее, понятнее и функциональнее, а с точки зрения не программиста, как мне кажется, — кошмарное нагромождение скобочек, стрелочек и значков «@». Нет, увольте.

Сегодня я решился все-таки посмотреть то, о чем говорит весь РуНет уже примерно неделю, — на проект Emax’a («Три сестры»). Я абсолютно не понял почему вокруг всего этого столько шуму. Будем считать, что идеей этого проекта я не проникся. Зато проникся идеей соседнего → www.sight.ru. Для того чтобы понять, что представляет из себя сайт, достаточно взглянуть на несколько работ, там представленных. Вот список наиболее понравившихся мне из просмотренных:

  • Девушка молодая, задумчивая;
  • Пора пришла;
  • Я птица слабая, мне тяжело лететь;
  • Двое в сторонке;
  • Дуб Ангела;
  • Монастырь.

Особенно понравилась первая, причем до такой степени, что я, активный противник фотографий и рисунков на десктопе, не удержался. Хотя понимаю, что ставить такое на десктоп — кощунство, ничего поделать с собой не могу.

Не скажу, что с нетерпением этого ожидал, но все-таки выход каждой новой версии PHP для меня — событие. Вот и сегодня, узнав о выходе PHP 4.0.4, я внимательно изучил change log, выкачал новую версию и документацию. Несмотря на то, что изменилась лишь вторая цифра после запятой, изменений довольно много. Если оценивать с точки зрения количества, то на моем домашнем разрешении (800×600) список занимает девять экранов. Качественного, как и ожидалось, скачка нет, обширный список багфиксов, с редкими вкраплениями новых возможностей. Особенно меня заинтересовала поддержка новой версией модуля OpenSSL и ключ «F» к функции preg_replace (за что он отвечает посмотрите сами), из багфиксов, цитирую, «fixed mysql_close(), pg_close(), msql_close() and sybase_close() — they weren’t properly closing the SQL connections». При всем уважении к создателям PHP у меня просто нет слов…

Оставить комментарий

← 1 7 8 9 10 11 12 →