Каким должен быть 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 запрос.
То есть, на каждый поток использую одну мультисессию, абсолютно независящую от других сессий.
Если есть еще предложения как улучшить скрипт - пожалуйста пишите, сделается новая версия.