Translate

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

PHP: запись информации в текстовый файл

Чтение и запись в текстовый файл казалось бы простейшая операция. Блокировал, открыл, записал, закрыл, снял блокировку с файла. Однако просто это только на первый взгляд….
Давайте подумаем, что произойдет, если к одному и тому же файлу одновременно обратятся несколько процессов, с целью записать туда какую-либо информацию? Могу сразу ответить: часть, либо вся информация, хранящаяся в файле будет безвозвратно потеряна. И просто блокировкой файла здесь не обойтись.

Простая замена phpMyAdmin для гиков

Довольно часто возникает ситуация, когда надо быстренько запустить пару запросов к MySQL базе у клиента на сервере. При этом есть только FTP и параметры соединения с СУБД. Самый простой выход — загрузить туда phpMyAdmin, ну а дальше дело техники. Обычно все это проиcходит на фоне того, что у клиента уже установлена какая-то CMS — WordPress, Drupal, Joomla…

Я люблю простые, красивые и удобные вещи. Я тепло отношусь к phpMyAdmin но в 90% моих Use Cases мне он не нужен. Нужно что-то простое. В идеале такое, что можно просто залить на сервер и открыть в браузере — не настраивая.

Пара вечеров и пакет готов.

Так как в чем-то это может быть изобретением велосипеда, да и с фантазией не очень — проект так и назвал — Bike :)


Что он умеет:
— Bike сам разберется, в подпапку чего его загрузили — WordPress, Drupal, Joomla и приконектится к базе. Конечно можно прописать ему connection parameters вручную.
— Bike хранит последние 40 запросов в LocalStorage — откроете его завтра и если не чистили кеш — запросы будут на месте.
— Можно запросу дать имя и сохранить в permanent storage. Bike не создает никаких таблиц, так что для постоянного хранения придется одну папочку на сервере открыть на запись. Кстати весьма удобно, если вы хотите клиенту подготовить какой-то отчет — напишите запрос, дайте ему имя, сохраните и все. Клиент откроет Bike и запустит его.
— Часто пользуетесь какими-то sql? Есть read-only библиотека запросов — добавьте их туда и они всегда будут с вами в разделе Library.
— Никаких FORM POST — мы любим AJAX.
— Bike достаточно неплохо выглядит (IMHO)

Ну вот, собственно, и все. Скачать можно тут https://github.com/jagermesh/bike. Там же есть ссылка на демо.

UPD: Работает только на PHP 5.3+

UPD2: По мотивам комментариев — закомитил на github packed версию — всего два файла загружаете на сервер и идете на /install.php.

http://habrahabr.ru/post/145578/

Видеоуроки php+MySQL. Урок 1. Введение о php (часть 1)


Оптимизируем загрузку PHP-кода в 22 раза


Чайник 
Тема данной стати — тот факт, что применение FastCGI в PHP не ускоряет время загрузки PHP-кода по сравнению, например, с mod_php. Дабы не судить поверхностно и не уподобляться некоторым профессионалам, рекомендую также прочитать и следующую наблу, в которой говорится о других накладных расходах (в частности, про расход памяти).

Большинство традиционных языков Web-программирования (Perl, Ruby, Python и т. д.) поддерживают написание скриптов, работающих в так называемом "FastCGI-режиме". Более того, Ruby on Rails, к примеру, вообще невозможно использовать в CGI-режиме, т.к. он тратит на подключение всех своих многочисленных библиотек десятки секунд.
Ниже я расскажу о методе, который позволяет в ряде случаев ускорить загрузку объемного PHP-кода более чем в 20 раз, не получая при этом побочных эффектов и значительных неудобств. Но вначале давайте поговорим об основах...

Что такое FastCGI?

Чайник 
Вначале поговорим, что называется, о "классическом" FastCGI, который применяют в Си, Perl, Ruby и т. д. В PHP же FastCGI имеет свои особенности, мы их рассмотрим чуть позже. Сейчас речь идет о не-PHP.
FastCGI работает следующим образом: скрипт загружается в память, запускает некоторый тяжелый код инициализации (например, подключает объемистые библиотеки), а затем входит в цикл обработки входящих HTTP-запросов. Один и тот же процесс-скрипт обрабатывает несколько различных запросов один за другим, что отличается от работы в CGI-режиме, когда на каждый запрос создается отдельный процесс, "умирающий" после окончания обработки. Обычно, обработав N запросов, FastCGI-скрипт завершается, чтобы сервер перезапустил его вновь уже в "чистой песочнице".
Чайник 
Для ускорения обработки стартует, конечно, не один процесс-скрипт, а сразу несколько, чтобы каждый следующий запрос не ждал обработки предыдущего. Как число одновременно запускаемых процессов, так и количество последовательных запросов на один процесс можно задавать в конфигурации сервера.
Старые скрипты, написанные с расчетом на CGI, приходится дорабатывать, чтобы они могли работать в FastCGI-окружении (касается использования FastCGI в Си, Perl и т. д.; на PHP дорабатывать не нужно, но у этого свои недостатки, см. ниже). Действительно, ведь раньше скрипт стартовал каждый раз "с чистого листа", а теперь ему приходится иметь дело с тем "мусором", который остался от предыдущего запроса. Если раньше CGI-скрипт на Perl выглядел как
скопировать код в буфер обмена
Листинг 1
use SomeHeavyLibrary;
print "Hello, world!\n";
то после переделки под FastCGI он становится похож на что-то типа
скопировать код в буфер обмена
Листинг 2
use SomeHeavyLibrary;
while ($request = get_fastcgi_request()) {
    print "Hello, world!\n";
}
Таким образом, получается экономия в скорости ответа: ведь каждый раз, когда приходит запрос, скрипту не нужно выполнять "тяжелый" код инициализации библиотек (подчас занимающий десятки секунд).
FastCGI имеет значительный недостаток: новый запрос начинает обрабатываться не в "чистом" окружении, а в том, которое осталось "с прошлого раза". Если в скрипте имеются утечки памяти, они постепенно накапливаются до тех пор, пока не произойдет крах. Это же касается и ресурсов, которые забыли освободить (открытые файлы, соединения с БД и т. д.). Есть и еще один недостаток: если код скрипта изменился, то приходится как-то сообщать об этом FastCGI-серверу, чтобы он "убил" все свои процессы и начал заново.
Собственно, техника "иницилизируйся один раз, обрабатывай много запросов" работает не только в FastCGI. Любой сервер, написанный на том же самом языке, что и скрипт, под ним запущенный, использует ее неявно. Например, сервер Mongrel написан целиком на Ruby как раз для того, чтобы под ним быстро запускать Ruby On Rails. Сервер Apache Tomcat, написанный на Java, быстро выполняет Java-сервлеты, т.к. не требует их повторной инициализации. Технология mod_perl также основана на том, что Perl-код не выгружается между запросами, а остается в памяти. Конечно, все эти серверы имеют те же самые проблемы с непредсказуемостью, утечками памяти и сложностью перезапуска, что и FastCGI-приложение.

Почему FastCGI не ускоряет PHP

Вероятно, вы слышали, что PHP тоже можно запускать в режиме FastCGI, и что так делают многие нагруженные проекты (Мамба, некоторые проекты Mail.Ru и т. д.). Это якобы дает "существенный прирост" производительности, потому что (согласно слухам) FastCGI экономит время инициализации скрипта и подключения библиотек.
Не верьте! В действительности поддержка FastCGI в PHP имеет чисто номинальный характер. Точнее, она не дает преимуществ в том смысле, в котором ей привыкли оперировать для уменьшения времени инициализации скрипта. Конечно, вы можете запустить PHP FastCGI-сервер и даже заставить nginx или lighttpd работать с ним напрямую, однако прирост скорости на загрузку кода, который вы от этого получите, будет нулевым. Тяжелые PHP-библиотеки (например, Zend Framework) как загружались долго в mod_php- или CGI-режимах, так и будут продолжать загружаться долго в режиме FastCGI.
Собственно, это неудивительно: ведь чтобы запустить любой PHP-скрипт в FastCGI-режиме, его не приходится дорабатывать. Ни строчки измененного кода! Когда я впервые решил поэкспериментировать с FastCGI в PHP, я потратил несколько часов времени на поиски в Интернете информации о том, как именно следует модифицировать PHP-код, чтобы оптимально запускать его в режиме FastCGI. Я проштудировал всю документацию PHP и несколько десятков форумов PHP-разработчиков, даже просмотрел исходный код PHP, но так и не нашел ни единой рекомендации. Имея прежний опыт работы с FastCGI в Perl и Си, я был несказанно удивлен. Однако все встало на свои места, когда выяснилось, что изменять код не нужно и, хотя в рамках одного FastCGI-процесса обрабатываются несколько соединений, PHP-интерпретатор каждый раз инициализируется заново (в отличие от "классического" FastCGI). Более того, похоже, большинство PHP-разработчиков, радостно использующих FastCGI+PHP, даже не подозревают о том, что оно должно работать как-то по-другому...

eAccelerator: ускорение повторной загрузки PHP-кода

Каждый раз, когда PHP-скрипт получает управление, PHP компилирует (точнее, транслирует) код скрипта во внутреннее представление (байт-код). Если файл небольшой, трансляция происходит очень быстро (Zend Engine в PHP — один из лидеров по скорости трансляции), однако, если включаемые библиотеки "весят" несколько мегабайтов, трансляция затягивается.
Существует ряд инструментов, кэширующих в разделяемой оперативной памяти (shared memory) оттранслированное внутреннее представление PHP-кода. Таким образом, при повторном включении PHP-файла он уже не транслируется, а байт-код берется из кэша в памяти. Естественно, это значительно ускоряет работу.
Одним из таких инструментов является eAccelerator. Он устанавливается в виде расширения PHP (подключается в php.ini) и требует самой минимальной настройки. Рекомендую включить в нем режим кэширования байт-кода исключительно в оперативной памяти и отключить сжатие (установить параметры eaccelerator.shm_only=1 и eaccelerator.compress=0). Также установите и настройтеконтрольную панель control.php, идущую в дистрибутиве eAccelerator, чтобы в реальном времени отслеживать состояние кэша. Без контрольной панели вам будет очень трудно проводить диагностику, если eAccelerator по каким-то причинам не заработает.
Преимущество eAccelerator в том, что он работает весьма стабильно и быстро даже на больших объемах PHP-кода. У меня ни разу не возникало проблем с этим инструментом (в отличие от Zend Accelerator, к примеру).

"Мой скрипт вместе с библиотеками занимает 5 МБ, как же быть?.."

Думаете, 5 МБ кода — это чересчур много для PHP? Ничего подобного. Попробуйте воспользоваться такими системами, как Zend Framework и Propel, чтобы убедиться в обратном. Zend Framework целиком занимает как раз около 5 МБ. Классы, сгенерированные Propel-ом, также весьма объемисты и могут отнять еще несколько мегабайтов.
Многие на этом месте посмеются и скажут, что не надо использовать Zend Framework и Propel, т.к. они "тормозные". Но действительность заключается в том, что тормозные вовсе даже не они... Плохую производительность имеет метод, который по умолчанию использует PHP для загрузки кода. К счастью, ситуацию нетрудно исправить.
Чтобы не быть голословным, я приведу результаты небольшого тестирования, которое я специально провел в "чистом" окружении, не привязанном к какому-либо конкретному проекту. Тестировалась скорость подключения всех файлов Zend Framework (за исключением Zend_Search_Lucene). Предварительно из кода были вырезаны все вызовы require_once, а загрузка зависимостей поизводилась только через механизм autoload.
Итак, всего подключались 790 PHP-файлов общим объемом 4.9 МБ. Немало, верно? Подключение осуществлялось примерно так:
скопировать код в буфер обмена
Листинг 3: Подключение всех 790 файлов ZF (4.9 МБ)
function __autoload($className) {
    $fname = str_replace('_', '/', $className) . '.php';
    $result = require_once($fname);
    return $result;
}
// Подключаем классы один за другим в порядке их зависимостей.
class_exists('Zend_Acl_Assert_Interface');
class_exists('Zend_Acl_Exception');
class_exists('Zend_Acl_Resource_Interface');
class_exists('Zend_Acl_Resource');
// ... и так для всех 790 файлов
Благодаря тому, что используется autoload, вызов class_exists() заставляет PHP подключить файл соответствующего класса. (Это самый простой способ "дернуть" autoload-функцию.) Порядок подключения я выбрал таким, чтобы каждый следующий класс уже имел загруженными все свои зависимые классы на момент запуска. (Этот порядок нетрудно установить, просто печатая в браузер значение $fname в функции __autoload).
Вот результаты тестирования с eAccelerator-ом и без на моем не очень мощном ноутбуке (Apache, mod_php):
  • Подключение всех файлов по одному, eAccelerator выключен: 911 мс.
  • Подключение всех файлов по одному, eAccelerator включен: 435 мс. Занято 15 М кэш-памяти под байт-код.
Как видите, eAccelerator дает примерно двукратное ускорение на 790 файлах общим объемом 4.9 МБ. Слабовато. К тому же, 435 мс —явно чересчур для скрипта, который только и делает, что подключает библиотеки.

А теперь добавим стероидов

Ходят слухи, что PHP гораздо быстрее загружает один большой файл, чем десять маленьких того же суммарного объема. Я решил проверить это утверждение, объединив весь Zend Framework в один файл размером 4.9 МБ и подключив его единственным вызовомrequire_once. Давайте посмотрим, что получилось.
  • Включение одного большого слитого файла, eAccelerator выключен: 458 мс.
  • Включение одного большого слитого файла, eAccelerator включен: 42 мс. Занято 31 МБ кэш-памяти под байт-код.
Первая строчка говорит о том, что один большой файл размером 4.9 МБ и правда загружается быстрее, чем 790 маленьких: 458 мс против 911 мс (см. выше). Экономия в 2 раза.
А вот вторая строчка заставила меня от удивления подпрыгнуть на стуле и перепроверить результат несколько раз. Надеюсь, это же произойдет и с вами. Действительно, 42 мс — это в 11 раз быстрее, чем с отключенным eAccelerator-ом! Получается, что eAccelerator еще меньше любит мелкие файлы (кстати, даже в режиме eaccelerator.check_mtime=0): экономия в 11 раз.
Итак, мы действительно получили ускорение загрузки в 22 раза, как и было обещано в заголовке. Раньше весь Zend Framework, разбитый на файлы, подключался 911 мс, а с использованием eAccelerator и объединенем всех файлов в один — 42 мс. И это, заметьте, не на реальном сервере, а всего лишь на рядовом ноутбуке.

Вывод: ускорение в 22 раза

Подведем итоги.
  • Слияние всех файлов в один большой плюс включение eAccelerator для этого большого файла дает ускорение в 22 раза при объеме кода 4.9 МБ и числе файлов 790.
  • В случае небольшого числа файлов значительного объема eAccelerator может дать 10-кратное ускорение. Если файлов много, а суммарный объем большой, то ускорение примерно в 2 раза.
  • Расход кэш-памяти зависит от числа файлов разбиения: при фиксированном объеме чем файлов больше, тем расход меньше.
При всем при этом eAccelerator лишен основных проблем "настоящего" FastCGI-сервера. Скрипты избавлены от утечек памяти и запускаются в гарантировано "чистом" окружении. Вам также не надо следить за изменением кода и перезапускать сервер всякий раз, когда внесены модификации в мало-мальски глубинный код системы.
Заметьте также, что мы подключали весь Zend Framework. В реальных скриптах объем кода будет сильно меньше, т.к. обычно для работы требуется лишь незначительная часть ZF. Но даже при условии, что библиотеки занимают 4.9 МБ, мы получаем время загрузки 42 мс — вполне приемлемое для PHP-скрипта. Ведь в нагруженных проектах PHP-скрипты могут работать и несколько сотен миллисекунд (Facebook, Мой Круг и т. д.).
Чайник 
Конечно, если вы планируете запускать FastCGI в PHP не из соображений производительности, а просто чтобы не "завязываться" за Apache и ограничиться связкой "nginx+PHP" или "lighttpd+PHP", ничто этому не мешает. Более того, задействовав eAccelerator для FastCGI+PHP и слив много файлов кода в один большой, вы получите то же самое ускорение, которое я описал выше. Однако не тешьте себя надеждами, что ускорение дал именно FastCGI: это не так. Применяя mod_php+eAccelerator, вы достигли бы практически такого же результата, что и FastCGI+eAccelerator.

Пара советов напоследок

Вручную объединять все файлы библиотек в один — утомительное занятие. Лучше написать утилиту, которая будет автоматически анализировать список PHP-файлов, подключенных скриптом, а при следующем запуске — объединять эти файлы и записывать во временную директорию (если это еще не сделано), после чего — подключать по require_once. Сегодня я оставляю написание такой утилиты (плюс-минус детали) на совести читателя.
Также рекомендую вам отказаться от явного включения файлов по require_once и переходить на autoload. Только не пытайтесь использовать для этого Zend_Loader: он очень медленный (по моим замерам, подключение ста файлов отнимет дополнительно около 50 мс). Лучше напишите собственную несложную autoload-функцию, которая будет быстро выполнять всю работу. Autoload позволит вам безопасно объединять несколько файлов библиотек в один, не думая о том, как бороться с "ручными" require_once.
Наконец, применяйте функцию set_include_path(), чтобы код подключения библиотек выглядел вот так:
скопировать код в буфер обмена
Листинг 4
require_once "Some/Library.php";
а не так:
скопировать код в буфер обмена
Листинг 5
require_once LIB_DIR . "/Some/Library.php";
Константы, определяющие путь к директории библиотек явным образом, — большое зло и усложнение программы. Они также косвенно противоречат стандартам кодирования Zend Framework и PEAR, которых я тоже рекомендую по возможности придерживаться.
Итак, хотите использовать "тяжелые" библиотеки в PHP-скриптах — на здоровье! PHP — скриптовый язык, по-настоящему позволяющий это делать без оглядки на неудобства FastCGI и проблемы "встроенных" серверов.
Лирическое отступление 
Читайте также продолжение в следующей набле. Там рассказано о таких понятиях, как балансировка нагрузки, reverse proxy и "медленные клиенты".
http://dklab.ru/chicken/nablas/49.html

Загрузка файлов на сервер с помощью CURL

Для одного из проектов нужно было загрузить файлы на сервер, с использованием CURL.
Делается это так:
$ch = curl_init();

$data = array('image' => '@{$full_path_file}'); //полный путь до файла

curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);
На локальном сервере работало на ура, но когда я залил на сервер клиента, все перестала работать.
Проблемы была в том, что переменная $_FILES отдавала
Array
(
    [image] => Array
        (
            [name] => 1308074391.jpg
            [type] => application/octet-stream
            [tmp_name] => /tmp/phpslor8l
            [error] => 0
            [size] => 33173
        )

)
вместо ожидаемого
Array
(
    [image] => Array
        (
            [name] => 1308074391.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/phpslor8l
            [error] => 0
            [size] => 33173
        )

)
Причина такого странного поведения заключалось в том что у клиента на хостинге перед Apache стоял Nginx, вот он и портил все.
Долгое гугление привело меня к единственно верному решению
$ch = curl_init();

$data = array('image' => '@{$full_path_file};type=image/jpeg'); //полный путь до файла

curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);
http://ajaxblog.ru/356

Встроенные библиотеки Joomla 1.5

Joomla включает в себя ряд полезных библиотек собственной и сторонней разработки. Рассмотрим самые полезные и популярные из них.
Для импорта библиотеки используется функция jimport() - она проверяет была ли загружена библиотека ранее, и если нет, то загружает. В виде параметра указывается путь и название загружаемого класса.
Например, если мы хотим импортировать внутренний класс JArchive, то параметром у нас должна служить строка "joomla.filesystem.archive". После этого будет попытка найти файл по адресу "/libraries/joomla/filesystem/" и в ней файл "archive.php".
jimport('joomla.filesystem.archive');
Joomla! не поддерживает расширение библиотек. Будущие версии (joomla v1.6) будут включать в себя возможность загрузки пользовательских библиотек. В следующей таблице описаны библиотеки, которые включены в Joomla!:
БиблиотекаОписание
archiveКласс по управлению архивами
bitfolgeУтилиты по работе с vCard
domitDOM XML парсер
geshiГенератор подсветки синтаксиса
joomlaЯдро joomla
openidУправление удаленным пользователем
pattemplateУправление шаблонами
pclУправление архивами
pearРасширения php
phpgaclОбщий контроль доступа
phpinputfilterФильтр нежелательных PHP/Javascript/HTML тэгов
phpmailerКласс для отправки сообщений электронной почты с использованием либо sendmail, фнкции PHP mail(), или SMTP
phputf8Утилиты UTF8 и ASCII
phpxmlrpcПротокол XML-RPC
simplepieRss и Atom
tcpdfГенератор PDF

Постоянные читатели