Каким должен быть php код?
3240 повідомлень
#17 років тому
Цитата ("Pilat66"):Вопрос не по теме, но мне непонятно, правильно ли указание* @copyrightвместе с лицензией GPL ?
Pilat66, в данном случае все правильно, так как вопросами, касающимися лицензий, владею IMHO досконально.
Данный мой проект не под GPL, а под LGPL (основная разница между GPL и LGPL в том, что библиотеки под LGPL можно использовать в коммерческих программных продуктах, не объявляя использующие эту библиотеку продукты продукты как Open Source продукты под лицензией GPL). Но это не имеет отношения к тому, почему я поставил значок @copyright. Поясню ниже детальнее.
На самом деле действительно, GPL/LGPL лицензии помещают ограничения copyleft на данный продукт. Но, хотя понятие копилефта и является антонимом копирайта, оно не отменяет мое право называться автором разработанного мной программного продукта. Более того, не только можно, но и НУЖНО ставить копирайт на своих GPL/LGPL продуктах. Почему? Пожалуйста ознакомьтесь с текстом по ссылке посилання, ниже я привел цитату из этого текста:
Цитата:
Чтобы поместить программу под действие copyleft, сперва мы объявляем свои авторские права на нее (copyright), далее добавляем условия распространения, являющиеся правовым базисом, согласно которому каждый получает права использования, модификации и распространения программного кода, а также любых производных программ на условии, что правила распространения неизменны. Таким образом, код и предлагаемые свободы становятся юридически нераздельными.
Если сомневаетесь что я прав, посмотрите пожалуйста во внутрь например того же известного класса Smarty.class.php (из пакета Smarty), обратите внимание - там та же самая лицензия LGPL, и точно так же ставится копирайт.
897 повідомлень
#17 років тому
If (!isset($_POST)&& !($_POST == 'act'))
{
Если !isset($_POST) , то $_POST может чему-то принадлежать? ))
If (!isset($_POST))
exit("Не существует переменной Email<br><a href=".$_SERVER."> Ещё раз</a>");
Этим делом нужно заниматься в другом месте, и выводить ошибки над формой заполненной введенными ранее данными.
$email = AddSlashes(str_replace("/","",str_replace("\\","",strtolower(htmlspecialchars(substr(trim($_POST),0,75))))));
$email = str_replace('"',"",str_replace("\\","",str_replace("\'","",str_replace("\"","",str_replace("'","",$email)))));
...
Упаковать в функцию.
Нет проверки длины $subject до символа \n .
$body = wordwrap($body, 70);
3240 повідомлень
#17 років тому
lyoxa, тот код мы уже давно обсудили и признали кодом начинающего программиста. Автор пообещал исправиться, надеюсь у него получится. Вы лучше мой код проверьте, который был несколькими сообщениями выше, в сообщении от 12 Августа 2007 22:46. Интересует Ваше мнение.
897 повідомлень
#17 років тому
private $curlOptions;
public function addUrl($url, $curlOptions = array()) {
Тут наверное лучше сразу определить массив.
foreach ($urls as $url) {
$this->addUrl($url, $curlOptions);
}
$urls не определена, или просто напутаны.
foreach ($url as $urls) {
$this->addUrl($urls, $curlOptions);
}
Код оформлен красиво и аккуратно.
3240 повідомлень
#17 років тому
Цитата ("lyoxa"):public function addUrl($url, $curlOptions = array())
Тут наверное лучше сразу определить массив.
Идея в том, что нужно передать первым обязательным параметром или один URL, или массив URLs, как угодно тому кто вызывает. Увы, в PHP нет перегрузок функций/методов, поэтому только так и приходится делать если не хочется создавать разные функции/методы с разными именами типа addUrl и addUrls. Второй параметр - необязательный, это массив дополнительных CURL OPTIONS, специфичных именно для текущего запроса(ов).
Цитата ("lyoxa"):
$urls не определена, или просто напутаны.
Спасибо, это дефект, недосмотрел. Исправлено. Можно смотреть MultiCurl class library 1.01 посилання, заодно добавил туда еще одну фичу, когда можно ограничивать размер скачиваемых данных (чтобы скрипт не умер если его направить например на 100 Mb страницу).
897 повідомлень
#17 років тому
Да не, я имел ввиду $curlOptions = array().Его наверное лучше private $curlOptions; тут определить.
Ибо там ниже он тоже функции передается.
589 повідомлень
#17 років тому
А сколько параллельных закачек на практике можно получить, и работает ли параллелизм при закачке через прокси ?Есть ли отслеживание зацикливания - когда два URL возвращают Location: друг на друга ?
1410 повідомлень
#17 років тому
tvv, я бы на Вашем месте определил бы еще __destruct на тот случай, если кто-то будет делать наследование Вашего класса.А код хороший - в принципе я бы еще в многих местах бы добавил бы блоки try ...catch.
1410 повідомлень
3240 повідомлень
#17 років тому
Цитата ("lyoxa"):Да не, я имел ввиду $curlOptions = array().
Его наверное лучше private $curlOptions; тут определить.
Ибо там ниже он тоже функции передается.
Сорри, не совсем понял. А оно же так и есть, оно же как private $curlOptions определено - для всех закачек. А тот $curlOptions, что в addUrl - он только для текущей одной закачки, то есть возможность устанавливать отдельные дополнительные опции для каждой закачки, если программисту это нужно.
Цитата ("Pilat66"):
А сколько параллельных закачек на практике можно получить, и работает ли параллелизм при закачке через прокси ?
Есть ли отслеживание зацикливания - когда два URL возвращают Location: друг на друга ?
Параллельных закачек можете делать сколько угодно, сколько Ваш сервер выдержит. По крайней мере, я не делал там ограничений.
Через прокси - работает. Параметры прокси достаточно передать дополнительным параметром или через setCurlOptions для всех закачек, или же можно установить отдельные параметры прокси для каждой закачки.
Зацикливание - не проблема. Отслеживание зацикливаемости, если оно возможно, точно так же можно регулировать параметрами курла, которые задаются извне через setCurlOptions. Например, можно установить не более чем N HTTP переходов (по Location).
Цитата ("ArtLab"):
tvv, я бы на Вашем месте определил бы еще __destruct на тот случай, если кто-то будет делать наследование Вашего класса. А код хороший - в принципе я бы еще в многих местах бы добавил бы блоки try ...catch.
Да, согласен, деструктор нужен.. В том числе чтобы не было утечек памяти в случае если программист забудет вызвать метод wait() в конце. Спасибо, внес в TODO, в следующей версии добавлю.
try .. catch - а в какие места их добавить? я пока что не увидел потребности, но если имеет смысл, то вставлю, подскажите пожалуйста, и обоснуйте, если у Вас есть время.
Цитата ("ArtLab"):
Позвольте с Вами не согласится. В 5 ветке это уже есть - ]http://php.ru/manual/language.oop5.overloading.html
Простите, но это совершенно не та перегрузка функций/методов, которая имеется ввиду в большинстве языков программирования. По сути в PHP "перегрузкой" назвали callback вызовы для методов, если они не определены до этого, и это не совсем корректно.
Что такое перегрузка? Вот примеры на Java:
public int getData() { ... }
public int getData(int code) { ... }
public int getData(String key, int code) { ... }
каждый метод со своей функциональностью, но с одинаковыми именами методов.
А на PHP с методами __get, __set, __call это безобразие а не перегрузка.
1410 повідомлень
#17 років тому
tvv, я не сказал, что это полноценная перегрузка методов/функций. Я только упомянул о том, что такая возможность есть. Я согласен, что она не такая удобная, как нужно, но лучше уж так, чем совсем никак, как это было до этого.
3240 повідомлень
#17 років тому
ArtLab, все равно, так можно обеспечивать только неявные вызовы методов, но обычные функции вне классов так "перегружать" не получится.
1410 повідомлень
#17 років тому
tvv, ну дак, у Вас же класс в Вашем проекте - поэтому я Вам и показал, что перегрузка существует (пусть и костыльная).
3240 повідомлень
1410 повідомлень
3240 повідомлень
#17 років тому
/**
* Class destructor. Close opened sessions.
*/
public function __destruct() {
foreach ($this->sessions as $i => $sess) {
$this->closeSession($i);
}
}
А он там есть, прямо под конструктором. Или где Вы смотрите?
1410 повідомлень
#17 років тому
Цитата ("tvv"):/**
* Class destructor. Close opened sessions.
*/
public function __destruct() {
foreach ($this->sessions as $i => $sess) {
$this->closeSession($i);
}
}
А он там есть, прямо под конструктором. Или где Вы смотрите?
Смотрел в самом конце класса - я обычно деструктор объявляю в конце класса, наверное это и сбило меня.
1410 повідомлень
#17 років тому
Кстати показывал класс знакомым - возникло одно предложение, как улучшить еще класс - сделать так, чтобы можно было не дожидаясь ,пока все потоки отработают возвращать информацию.
3240 повідомлень
#17 років тому
Цитата ("ArtLab"):Смотрел в самом конце класса - я обычно деструктор объявляю в конце класса, наверное это и сбило меня.
А я деструктор всегда объявляю под конструктором. Это у меня еще с С++ пошло, затем Java... В общем, последние лет 12 только так и делаю.
Цитата ("ArtLab"):
Кстати показывал класс знакомым - возникло одно предложение, как улучшить еще класс - сделать так, чтобы можно было не дожидаясь ,пока все потоки отработают возвращать информацию.
Кстати, а у меня именно так и есть!
КАЖДЫЙ поток работает независимо от остальных, и сразу возвращает результат как только он есть, не дожидаясь остальных потоков.
После этого сразу можно стартовать еще один поток, не дожидаясь, пока остальные еще активны.
По сути я применил такой прием - использую асинхронную мультисессию, в которой используется один и только один CURL запрос.
То есть, на каждый поток использую одну мультисессию, абсолютно независящую от других сессий.
Если есть еще предложения как улучшить скрипт - пожалуйста пишите, сделается новая версия.