IT Kniga
Интернет-магазин компьютерной литературы

PHP

require кода как части функции

PHP Developer - LiveJournal.com - Ср, 28/07/2010 - 13:14
Ввиду того, что в пятницу я не работаю, а сегодня другой еды нет, тривиальный вопрос:

1) Что вы имеете против include/require файлов как частей функций/методов?

2) А так же, что вы имеете против образования различного функционала путем подмены пути к файлу с кодом?

Я вижу только один минус: код не в том же окне редактора.

файл с классом: <? class SomeClass{ ... public function doSomething(){ require($this->file_with_code); } ... } ?> файл $file_with_code: <? $this->doSomething1(); $this->doSomething2(); $this->doSomething3(); ?>

Unicode в PHP 6

PHP Developer - LiveJournal.com - Пнд, 26/07/2010 - 11:02

Последнее время ходят разговоры об отмене проекта PHP 6 в том виде, в котором он был запланирован. Причиной стали трудности, возникшие при реализации нативной поддержки Unicode. В связи с этим высока вероятность, что PHP 5.4 все же увидит свет раньше шестерки и включит в себя прочие ее нововведения (кроме Unicode), и в частности, расширение APC.

Об этом, а также о создании PHP-приложений для Android можно почитать/послушать в этом подкасте (англ).

Принципиальная разница между goto и throw

PHP Developer - LiveJournal.com - Вс, 25/07/2010 - 12:50
Меня тут в одном сообществе чуть не убили просто за упоминание слова "goto".
И я задумался.
Ведь по сути, оно делает то же самое, что и throw - прекращает выполнение определенного куска кода, если оно, при наступлении определенного условия, становится ненужным.

Собственно, два вопроса.
Так ли страшно goto, как его малюют?
Есть ли принципиальная разница между этими двумя кусками коду?
Именно принципиальная, а не в частностях.
Если данный код разницу не иллюстрирует - прошу привести другой.

<?php

#$a=1;
#$b=2;

/* SNIPPET #1 */

try {
    if (!isset($a)) {
      throw new Exception('$a is not set');
    }
    if (!isset($b)) {
      throw new Exception('$b is not set');
    }
    echo '$a + $b = '.($a + $b)."<br>\n";
} catch (Exception $e) {
    echo 'Caught exception: ', $e->getMessage(), "<br>\n";
}

/* SNIPPET #2 */

if (!isset($a)) { 
  $message = '$a is not set';
  goto end;
}
if (!isset($b)) {
  $message = '$b is not set';
  goto end;
}
echo '$a + $b = '.($a + $b)."<br>\n";

end:
if (!empty($message)) {
  echo 'Caught exception: ', $message, "<br>\n";
}

Самый простой обфускатор

PHP Developer - LiveJournal.com - Ср, 14/07/2010 - 19:16
Подскажите, существует ли в природе самый простой обфускатор, удаляющий пробелы, newline и комментарии? Т.е. аналог #php -w < script.php ?

Проблема с записью на ftp

PHP Developer - LiveJournal.com - Ср, 14/07/2010 - 08:27
Доброго всем времени суток!

Столкнулся с такой проблемой: мне нужно большой zip архив залить на удаленный ftp сервер. Проблема в том, что скрипт отрабатывает 5 минут и останавливается, не залив файл до конца. Я решил, что стоит заливать файл по частям но снова наткнулся на грабли: не нашел возможности ДОПИСЫВАТЬ в удаленный файл.

Стандартных функций для работы с ftp я не нашел, при использовании fopen('ftp://...','a') выдается ошибка:
"failed to open stream: FTP server reports 451", при использовании fopen('ftp://.../,'w') и fseek($f,...) выдается другая ошибка: "stream does not support seeking". Еще был вариант открыть для чтения и записи, прочитать до конца и начать записывать, но снова ошибка:
"failed to open stream: FTP does not support simultaneous read/write connections in". Поиски в интернете ничего не дали. Кто нибудь может посоветовать, что делать?

Хочу объектный массив в PHP

PHP Developer - LiveJournal.com - Чт, 08/07/2010 - 18:59
Приветствую всех.

Не так давно я попытался ввести в свои приложения ОО-массив. Он мне был очень нужен исходя из следующих причин:

1. echo foo()[0]; - к элементу массива, возвращённого через функцию или метод, нельзя получить доступ как показано выше. Это оказалось дико неудобным в работе. В JavaScript, например, это можно сделать без проблем: alert(foo()[1][0])

2. При отсутствующем значении в массиве получать NULL:$object->non_exists_prop; // nullСейчас для меня, после года работы с данным объектом, Notice при отсутствующем значении в массиве является _дикостью_.

3. ОО-интерфейс.

Сначала я хотел использовать встроенный объект ArrayObject, но он оказался попросту бесполезным для моих целей, да и создан для обратного.

В итоге пришлось написать свой велосипед, вот код. И пример:
$array = new Cover_Array( array('foo', 12345, 'element' => array('key' => 'value', 'key2' => 'value2')) ); echo $array->item(0); // foo echo $array->element->key; // value echo $array->element->count(); // 2 echo $array->element->append('привет, PHP!')->item(0); // привет, PHP! echo $array->element->count(); // 3 print_r($array->getDataAsArray()); // получаем обычный многомерный массив foreach ($array->element as $key => $value) { echo "$key => $value<br>"; // key => value // key2 => value2 // 0 => привет, PHP! } $array->new = array(1,2,3); print_r($array->new); // array приводится (!) к типу Cover_Array // Cover_Array Object ( [data:protected] => Array ( [0] => 1 [1] => 2 [2] => 3 ) )

Собственно, проблема одна - работает это дольше обычных массивов. А поскольку в приложении таких массивов-оберток много, то создаются естественные тормоза. Правда, я их не мерил, но это заметно по наносекундам.

Теперь, хочется услышат такой ответ - подобная реализация имеет право на существование или нет?

нид хелп. RegExp

PHP Developer - LiveJournal.com - Втр, 06/07/2010 - 16:09
Делаю рефакторинг & работу над ошибками.
Имееццо регулярка, выдёргивающая тег из текста.
$reels = '/<(' . $tagPattern . ')\s*([^\/>]*)\s*(?:\/>|>(.*?)<\/\s*\\1\s*>)/s' ;

На выходе выдёргиваем, соответственно, параметры тега и содержимое.

но когда мы натыкаемся на вложенные друг в други теги оно (надо же! :) ) начинает сбоить.
подозреваю, что должно быть что-то вида

$reels = '/<(' . $tagPattern . ')\s*([^\/>]*)\s*(?:\/>|>( (  (<\\1\s.+>.+<\/\s*\\1\s*>)|.*  )? )<\/\s*\\1\s*>)/s' ;

но подобная конструкция поддерживает только одну вложенность.

а как решить проблему в идеале?


или вообще это не регулярок задача?

Передача пароля

PHP Developer - LiveJournal.com - Втр, 06/07/2010 - 07:59
Нужно с одного сайта передать пароль на второй.
Ну типа Header("Location:http://site.ru/?pwd=blabla");
Только чтобы пароль, понятное дело, не виден был.
Где копать? Куки? Шифровать?

Правильный запуск внешних приложений

PHP Developer - LiveJournal.com - Пнд, 28/06/2010 - 10:03
Есть консольная программа для конвертации книг из одного формата в другой (calibre) - при запуске программы ручками - она отрабатывает нормально, при запуске из php - внешняя программа выдает ошибку.
Запускал с помощью exec, system, passthru, popen - одно и то же.
Чего то не хватает программке в окружении?

OS - Ubuntu.

код скрипта:

function my_exec($cmd, $input='') {$proc=proc_open($cmd, array(0=>array('pipe', 'r'), 1=>array('pipe', 'w'), 2=>array('pipe', 'w')), $pipes); fwrite($pipes[0], $input);fclose($pipes[0]); $stdout=stream_get_contents($pipes[1]);fclose($pipes[1]); $stderr=stream_get_contents($pipes[2]);fclose($pipes[2]); $rtn=proc_close($proc); return array('stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$rtn ); } $c = 'ebook-convert test.fb2 test.pdf'; var_export(my_exec($c));

Результат работы:
array ( 'stdout' => '1% Converting input to HTML... InputFormatPlugin: FB2 Input running on test.fb2 Parsing all content... Forcing index.xhtml into XHTML namespace Generating default TOC from spine... 34% Running transforms on ebook... Merging user specified metadata... Detecting structure... Auto generated TOC with 27 entries. Flattening CSS and remapping font sizes... Transformed CSS selector h|A to h|a Transformed CSS selector h|BODY to h|body Transformed CSS selector h|H1 to h|h1 Transformed CSS selector h|H2 to h|h2 Transformed CSS selector h|H3 to h|h3 Transformed CSS selector h|H4 to h|h4 Transformed CSS selector h|H5 to h|h5 Transformed CSS selector h|H6 to h|h6 Transformed CSS selector h|SMALL to h|small Transformed CSS selector h|BLOCKQUOTE to h|blockquote Transformed CSS selector h|HR to h|hr Transformed CSS selector h|DIV to h|div Transformed CSS selector h|UL to h|ul Source base font size is 12.00000pt Cleaning up manifest... Trimming unused files from manifest... Creating PDF Output... 67% Creating PDF Output ', 'stderr' => 'Traceback (most recent call last): File "/tmp/init.py", line 48, in File "/home/kovid/build/calibre/src/calibre/ebooks/conversion/cli.py", line 254, in main File "/home/kovid/build/calibre/src/calibre/ebooks/conversion/plumber.py", line 926, in run File "/home/kovid/build/calibre/src/calibre/ebooks/pdf/output.py", line 67, in convert File "/home/kovid/build/calibre/src/calibre/ebooks/pdf/output.py", line 94, in convert_text File "/home/kovid/build/calibre/src/calibre/ebooks/pdf/output.py", line 97, in write File "/home/kovid/build/calibre/src/calibre/ebooks/pdf/writer.py", line 112, in __init__ Exception: Not OK to use Qt ', 'return' => 1, )

Результы работы при запуске руками:
1% Конвертирую входной файл в HTML... InputFormatPlugin: FB2 Input running on test.fb2 Parsing all content... Forcing index.xhtml into XHTML namespace Generating default TOC from spine... 34% Выполняю преобразования книги... Merging user specified metadata... Detecting structure... Auto generated TOC with 27 entries. Flattening CSS and remapping font sizes... Transformed CSS selector h|A to h|a Transformed CSS selector h|BODY to h|body Transformed CSS selector h|H1 to h|h1 Transformed CSS selector h|H2 to h|h2 Transformed CSS selector h|H3 to h|h3 Transformed CSS selector h|H4 to h|h4 Transformed CSS selector h|H5 to h|h5 Transformed CSS selector h|H6 to h|h6 Transformed CSS selector h|SMALL to h|small Transformed CSS selector h|BLOCKQUOTE to h|blockquote Transformed CSS selector h|HR to h|hr Transformed CSS selector h|DIV to h|div Transformed CSS selector h|UL to h|ul Source base font size is 12.00000pt Cleaning up manifest... Trimming unused files from manifest... Creating PDF Output... 67% Создаю PDF Output PDF output written to test.pdf Выходные данные сохранены в test.pdf

&nbsp;Возникла нетриви

PHP Developer - LiveJournal.com - Ср, 23/06/2010 - 11:03
 Возникла нетривиальная задача.

Нужно перенаправить поток вывода с экрана в переменную//файл на какой-то отрезок работы php-скрипта, а затем снова переключиться на вывод с экрана.

Например, есть у нас скрипт

------------------
<? $a=1; $b=2;
echo $a+$b;
?> - IT IS MAGIC! <? $c=4; echo $a+$b+c ?> YES!
------------------

Необходимо, чтобы текст "3 - IT IS MAGIC" был перенаправлен в файл template.txt а "4 YES!" было отдано клиенту.

Курю маны, пока ничего подобного найти не смог.
В какую сторону копать?

Передача параметров

PHP Developer - LiveJournal.com - Втр, 22/06/2010 - 05:25
Привет!

Есть скрипт преобразующий изображение (размеры, фон и бла бла бла).
Скрипту мы передаем параметры через GET типа <img src="/img.php?f=hi.jpg&w=150&h=200&far=1" /> что вызывает рвоту и понос!
В идеале красиво было-бы так <img src="/img/sks8d879sd8f7987f8s7df8sd8f7.jpg" /> или так <img src="/img/123456.jpg" /> где sks8d879sd8f7987f8s7df8sd8f7 или 123456 ключ к данным где хранятся параметры ширины, высоты и т.д.
Собственно вопрос, где лучше хранить эти параметры в базе или в файлах? Интересует с точки зрения нагрузки на сервер, с базой ведь предется на каждую картинку выполнять и подключение и запрос, а если картинок этак 100 на странице? Или может есть альтернативный метод передачи параметров, красиво зашифровав и дешифровав исполняемым скриптом?

Предложение работы. Вакансия Senior PHP Developer в Харькове

PHP Developer - LiveJournal.com - Пнд, 21/06/2010 - 09:32
У нас открыта вакансия Senior PHP Developer.
Требования:
- обязательный опыт работы с PHP5, MySQL5, FreeBSD (Linux), JavaScript;
- опыт работы с nginx, memcached приветствуется;
- знание ещё одного языка программирования приветствуется;
- знание паттернов проектирования приветствуется;
- к резюме обязательно прилагать 200-300 строк кода, написанного Вами;
- возраст до 30 лет.

Условия:
- рабочий день с 10.00. (11.00.) до 19.00.(20.00);
- пятидневная рабочая неделя;
- оплачиваемый отпуск (21 день);
- ЗП 1500$.

Если Вам будет интересна наша вакансия и условия, пришлите нам исходные коды каких-либо своих проектов, на PHP и по возможности на JS на мыло ryabukhinak@googlemail.com

ru_magento

PHP Developer - LiveJournal.com - Чт, 17/06/2010 - 06:35

Друзья, приглашаю в новое сообщество о Magento ru_magento .

Здравствуйте.<br /><br />

PHP Developer - LiveJournal.com - Пт, 11/06/2010 - 20:46
Здравствуйте.

Пытаюсь подключиться к удаленному фтп через curl. Использую такую вот конструкцию:

curl_setopt($ch, CURLOPT_URL, 'ftp://login@host.net:pass@xx.xx.xx.xx/'."test_curl.txt");

где login@host.net - это имя пользователя для фтп. Проблема в том, что когда в логине присутствует символ @, curl выдает ошибку 6, то есть, can't resolve host. Подозреваю, что как хост в этом случае воспринмиается все то, что стоит после первого @.

Если убрать @ из имени пользователя, то хост он находит, но естественно выдает ошибку 67 - не может залогиниться. Посоветуйте пожалуйста как с этим бороться.

Спасибо.

проблема с ftp_put

PHP Developer - LiveJournal.com - Ср, 09/06/2010 - 07:59
Добрый день.
Подскажите пожалуйста в чем может быть проблема. Я просто пытаюсь положить файл на фтп. Вот мой код:

$connection = ftp_connect('хх.хх.хх.хх');
$login = ftp_login($connection, 'user', 'pass');
echo('logged_ok
');


if (!$connection || !$login)
{
echo('FTP connection failed!');
}
else
{
echo('start uploading, time='.time().'
');
$upload = ftp_put($connection,"1125.xml", "/home/teremco/public_html/UsersXMLOUT/1125.xml", FTP_BINARY);
echo('finished uploading, time='.time().'
');

if (!$upload) { echo 'FTP upload failed!'; }


}

ftp_close($connection);




Когда доходит до ftp_put - все виснет секунд на 40, после чего появляется ошибка 404. Подскажите как узнать в чем именно проблема?

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

Заранее благодарю за помощь.

Конфигурационный файл для IoC / Factory / DI

PHP Developer - LiveJournal.com - Пт, 04/06/2010 - 03:05
Привет, коллеги. Кто из вас использует IoC (inversion of control) и/или фабрику объектов и/или инъекцию зависимостей? Может кто-нибудь показать мне пример конфигурационного файла, в котором описываются межобъектные зависимости? что-то вроде

INSTANCES:
  Barsik:
    class: Black_Cat
    config: [...]
  Layka:
    class: White_Dog
    config: [...]
  Sharik:
    class: Red_Dog
    config: [...]

DEPENDENCIES:
  class Application
    interface iCat: instance Barsik
    interface iDog: instance Layka
    class Sub:
      interface iDog: instance Sharik



Так вот, как эта конфигурация выглядит у вас?

php session - меняется ID

PHP Developer - LiveJournal.com - Чт, 03/06/2010 - 18:12
привет, коллеги
вроде это легко, но вопрос такой - в некоторых браузерах (чаще всего в IE, но также наблюдалось в FF и Safari) на некоторых машинах меняется ID сессии, сайт на PHP
все как обычно, в начале каждой страницы сайта есть include файла init.php, в котором первая строка вот такая:

<?php 
session_start();
...
?>

после чего я для проверки вывожу на каждой странице ид сессии через session_id() и в некоторых случаях он меняется на другой при переходе со страницы на страницу, особенно при переходе через POST
от чего это может зависеть? проблема в том, что есть сайт с корзиной и все товары при покупке записываются туда, когда же происходит переход на checkout - ид сессии меняется и соотв. информация о покупках теряется
не могу найти причину, почему на некоторых компьютерах всегда стабильно работает, на некоторых работает через раз

куки? что-то еще? где копать?
спасибо за ответы

Исходный код POST запроса

PHP Developer - LiveJournal.com - Чт, 03/06/2010 - 09:53
Здравствуйте.

Возможно ли в PHP получить исходный код POST запроса, т.е. не сам массив $_POST, а то, из чего составлялся массив $_POST.

Исходный код POST запроса и имеет вид:

Content-Type: multipart/form-data; boundary=---------------------------287032381131322
Content-Length: 658 -----------------------------287032381131322
Content-Disposition: form-data; name="_target1" 1 -----------------------------287032381131322--

Посмотреть можно в Firebug: Сеть -> POST -> Исходный код.

Запоминание значений в полях

PHP Developer - LiveJournal.com - Пнд, 31/05/2010 - 04:01
Добрый день!

Странная ситуация, но в гугле ответа на этот вопрос не нашел.
Дело в том, что раньше на моем сайте было так: При заполнении формы если обновить страницу, уйти куда-то и вернуться назад, введенные данные сохранялись в форме. Какое-то время назад, в ходе какого-то апдейта что-то поломалось и теперь форма очищается при обновлении страницы или при возвращении с другой страницы (написали
что-то в форме, перешли по ссылке, щелкнули назад, а все пусто). Не знаю что где поменял, но поломалось на всем сайте, все формы теперь так ведут.

Может, есть у кого идеи из-за чего оно вдруг могло произойти?

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

Весь моск уже сломал. :(

одноименные функции на PHP

PHP Developer - LiveJournal.com - Пт, 28/05/2010 - 17:50
Добрый вечер, ru_php!
Возможно туплю, но есть такая казалось бы простая задачка, основной загвоздкой в которой является необходимость вызвать в одном php файле две одноименные функции, описание которых находится в двух разных файлах, подключаемых через require_once. По описанию функции разные. При решении задачи в лоб, естественно, выдается ошибка Fatal error: Cannot redeclare func1() (previously declared in Z:\home\test\www\includes\fromfile1.php:6)...
Первое (и последнее), что пришло на ум - создать в каждом файле с описаниями функций разноименные классы, и осуществлять вызов функций в основном файле как одноименные методы объектов этих классов... Но, по-моему, это совершенно не то, что требовалось.

Может, кто что посоветует?
RSS-материал