Pull to refresh
139
0
Виктор Большов @crocodile2u

Software Developer

Send message

расширение zip, небольшой хинт

Reading time1 min
Views1.5K
В одном из моих проектов широко используется импорт различных данных в формате CSV. Когда-то данных было немного и всех устраивало непосредственно загрузить один-два не слишком больших файла. Со временем данных стало больше, выросли размеры импортируемых файлов и их количество. Решено было загружать файлы в ZIP-архиве: экономим трафик + имеем всего один аплоад вместо несольких.

Для работы с архивом я воспользовался расширением zip. Описывать здесь, что к чему в этом расширении, я здесь не буду, это достаточно подробно описано в документации.

Я расскажу лишь об одной особенности, которая оказалась для меня полезной. При импорте файла, который пользователь загружает в форме, сам по себе ZIP-архив на сервере ни к чему, да и распаковывать его тоже без надобности: потом ведь еще удалять придется. На помощь приходит метод ZipArchive->getStream(). Получаем с его помощью файл-хэндлер и можем спокойно скормить его, допустим, в fgetcsv.

UPD. Наверное, не совсем понятно объяснил. Мне нужны данные из тех CSV-файлов, которые лежат в ЗИПе. И нужны мне эти данные в базе данных, а не в самих ЦСВшках и уж тем более не в архиве. То есть данные из ЦСВшек я импортирую в БД. Поэтому я беру тепленьким временный файл ( $_FILES['userfile']['tmp_name'] ). И прямо не распаковывая его, импортирую все содержащиеся в нем ЦСВшки в БД. После этого PHP сам позаботится о том, чтобы удалить архив, который больше уже не нужен.

UPD. От хабраюзера Adelf: в некоторых случаях (не в моем) следует принимать во внимание факт того, что $_FILES['userfile']['tmp_name'] может быть недоступен из-за open_basedir

Надеюсь, эта информация кому-нибудь окажется полезной.
Total votes 30: ↑19 and ↓11+8
Comments21

Как мне помог meld

Reading time1 min
Views1.1K
Meld — это программа для сравнения файлов и каталогов, умеющая, помимо прочего, работать с системами контроля версий.

Сегодня мне пришлось просмотреть ряд директорий с исходниками и сравнить их с аналогичными исходниками из другой версии проекта (по историческим причинам, эти версии хранились в разных репозиториях, так что сравнивал я именно директории, но это не суть важно).

Задача была такая — найти все нужные изменения в более старой версии, которые нужно перенести в новую (естественно, с сохранением тех изменений, которые уже там содержались).

С помощью Meld мне удалось сделать это в рекордные сроки, ибо он очень прост и функционален. Рекомендую всем, кто ищет хорошую программу для сравнения файлов и каталогов под linux
Total votes 6: ↑6 and ↓0+6
Comments9

разбираем файлы MS-office

Reading time2 min
Views4.6K
Недавно передо мной была поставлена задача: вытащить некую информацию из файлов MS-office (.xls, .doc) для ее последующей обработки. По факту, нужно было вытащить текст, содержащийся в документе.

Как без особого труда вытащить текст, содержащийся в файлах XLS или DOC
Total votes 40: ↑36 and ↓4+32
Comments28

Не забывайте пароли, тем более от электронных кошельков

Reading time1 min
Views627
Некоторое время назад в мой Я.Кошелек «упала» небольшая сумма. Вчера я решил ей воспользоваться, пошел в книжный магазин (интернет-магазин, знамо дело) — и выбрал себе парочку книг. Выбрал способ оплаты — Я.Деньги и перешел на страницу подтверждения оплаты…

Черт! Черт!!! Черт!!! Я забыл пароль!

Пытался вспомнить пароль, потом нажал на кнопку напоминания пароля. Там мне быстренько выслали письмо на мой почтовый Я.щик — и я отправился на почту его получать. Захожу — а в письме ссылка. Захожу по ссылке…

Черт! Черт!!! Черт!!! Я забыл «кодовое число»! А его нужно ввести, чтобы тебе напомнили пароль!

5 раз пытался я ввести кодовое число — и после этого капут — число попыток исчерпано. Теперь мне придется ехать в офис с заполненным бланком заявки на восстановление пароля…

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

Мораль может быть только одна — не забывайте пароли!
Total votes 64: ↑15 and ↓49-34
Comments17

распараллеливаем выполнение задач с помощью stream_select()

Reading time7 min
Views5.2K
Не так уж много кто знает о том, что некоторые задачи в PHP можно заставить выполняться параллельно — и для не этого не нужно прибегать к форкам. В PHP5 есть stream-functions, и среди них — stream_select().

Прочитав статью Cameron Laird (http://www.ibm.com/developerworks/opensource/library/os-php-multitask/index.html?S_TACT=105AGX44&S_CMP=EDU), каждый, кто еще этого не сделал, сможет научиться этой технике, я же в этом топике предлагаю вашему вниманию простой небольшой класс Parastreams, который собсно займется распараллеливанием — а уж что делать с полученными из потоков данными — вы решите сами, указав обработчики данных.

Читать дальше →
Total votes 47: ↑44 and ↓3+41
Comments16

coworking без центра

Reading time1 min
Views527
Итак. В данное время я нахожусь в процессе смены места работы. Пока что я работаю в Москве, а живу в Обнинске (100км) и трачу на дорогу безумное количество времени (2 часа в один конец). Предложили работать удаленно за те же деньги, что и сейчас. Я ухватился за предложение, но меня немного смущало то обстоятельство, что надо будет работать всю неделю из дома (домашняя атмосфера как-то расслабляет).

И вдруг звонит мне один из моих друзей:
— Ты вроде на удаленку переходишь? Если есть желание, можешь сидеть у нас в офисе за небольшую плату. Дадим тебе стол и интернет.

Вот так. 1300 руб. в месяц + оплата интернета (60 коп/Мб) — и полноценное рабочее место в приятном офисе, в одном помещении с другими веб-программистами :)

Зачем этот топик?

Я просто думаю, что есть люди, которые рады бы работать по системе coworking, но не имеют возможности по причине отсутствия в их городе coworking-центра. Может быть, этот пост наведет их на мысль обзвонить друзей и знакомых, работающих в офисах: не найдется ли там пара квадратных метров?
Total votes 5: ↑4 and ↓1+3
Comments2

О пользе namespace'ов

Reading time1 min
Views1.4K
В последних версиях PHP появились namespace'ы — пространства имен.

У них есть очевидные преимущества:
— помогают сократить названия классов;
— позволяют избежать конфликтов имен;
— помогают лучше структурировать классы.

Но, помимо этого, есть еще преимущество, на которое не так часто обращают внимание: namespace'ы помогают разработчику видеть зависимости того или иного класс, причем это не приводит к какому-либо оверхеду. Поясню.

Помните, как в PHP4 мы писали перед объявлением класса:
require_once "MyClassParent.php";
require_once "MyClassDependency.php";


Потом пришел PHP5, появился __autoload() и spl_autoload_register() — мы убрали безусловные подключения файлов и вместе с ними оверхед. Все хорошо, да вот только теперь не так очевидно стало, какие же другие классы/файлы нужны для нашего класса, чтобы он нормально функционировал.

И тут — появляется батут php-5.3. Теперь, без лишнего оверхеда мы можем, и даже не только можем, но и в определенных случаях должны — указывать зависимости нашего класса:
use myns::MyClassParent;
use anotherns::MyClassDependency;


Отметим, что при использовании use не происходит подключения файлов с классами.
Теперь, как говорится, и программисты волки сыты, и харды овцы целы.
Total votes 30: ↑23 and ↓7+16
Comments20

PHP-5.3, phar extension — нужен ли он по дефолту?

Reading time1 min
Views1.1K
В PHP-5.3 появилось расширение phar, причем в последних версиях оно включено по умолчанию. Однако, после того как я наблюдал следующую картину: сегфолт при использовании стандартной функции is_file() (который на самом деле является прямым следствием того, что вместе с PHP у меня установился этот самый phar) — после этого я крепко задумался, нужно ли это расширение ставить по умолчанию и не лучше ли было бы ставить его, наоборот, только по требованию.

Вкратце: расширение объявляет «перехватчики» — interceptors — для вызовов некоторых функций, вовсе не входящих в это расширение. Это поведение, по очевидным причинам, для многих нежелательно — это лишние тормоза, лишние баги (как доказывает вышеприведенная ссылка на bugs.php.net).

Могу добавить, что один из ведущих разработчиков PHP уже высказался за то, чтобы не включать phar по дефолту. А что думаете вы?
Total votes 10: ↑7 and ↓3+4
Comments4

session_write_close() может стать твоим другом

Reading time1 min
Views13K
Однажды я столкнулся с такой проблемой: на странице сайта с помощью PHP-скрипта выдавался пользователю видео-контент (подробнее в моей статье «flash-видео на веб-страницах и PHP»).

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

Ларчик открывался довольно просто. На сайте использовалась авторизация, основанная на стандартных PHP-сессиях. Так вот, когда сессия стартуется, сессионный файл блокируется, и до тех пока сессия не закроется и файл не разблокируется, никто не может открыть файл сессии. По умолчанию сессия закрывается при окончании работы скрипта. Мы добавили непосредственно перед выдачей видео-контента строку session_write_close() — вуаля, все заработало.

Поскольку совсем недавно товарищ пожаловался на точно такую же проблему и был рад полученной подсказке — я решил поделиться этим «хинтом» с хабралюдьми.
Total votes 18: ↑14 and ↓4+10
Comments14

flash-видео на веб-страницах и PHP

Reading time8 min
Views6.1K
Эта статья — перепечатка статьи от 16 ноября 2007 г. с моего блога, ссылку на который можно найти в моем же профайле — но, поскольку так уж вышло, что тема эта, кажется, до сих пор многим интересна, к тому же не так давно я читал на эту тему доклад на конференции PHPConf… в общем — судите сами.

Вступление


В последнее время все большее распространение получает технология трансляции видео через веб – без необходимости скачивать медиа-контент на машину пользователя, с просмотром прямо из браузера. Таким образом можно просматривать довольно большое количество различных форматов видео, однако, это требует наличия определенных плагинов на стороне пользователя. Очевидно, самым распространенным подобным плагином является flash-player (ну хорошо, хорошо: если быть точным, то он, конечно же, не может сам по себе проигрывать видео – но позволяет легко создать приложение, способное воспроизводить видео-контент). Яркий пример такого подхода – youtube.com. Попытаюсь рассказать о том, как самостоятельно организовать трансляции флэш-видео на своей веб-странице и какие существуют подходы к этой проблеме.

Читать дальше →
Total votes 19: ↑19 and ↓0+19
Comments20
2

Information

Rating
Does not participate
Location
Amsterdam, Noord-Holland, Нидерланды
Date of birth
Registered
Activity