Вадим Т.
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 повідомлень
#17 років тому
Цитата ("tvv"):
Увы, в PHP нет перегрузок функций/методов, поэтому только так и приходится делать если не хочется создавать разные функции/методы с разными именами типа addUrl и addUrls.


Позвольте с Вами не согласится. В 5 ветке это уже есть -
Вадим Т.
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 повідомлень
#17 років тому
О, наконец-то и на SourceForge мой проект добавился:

ArtLab, там уже новая версия 1.02, измененная, деструктор добавлен.
Станислав Малкин
1410 повідомлень
#17 років тому
Цитата ("tvv"):
О, наконец-то и на SourceForge мой проект добавился:

ArtLab, там уже новая версия 1.02, измененная, деструктор добавлен.


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

Если есть еще предложения как улучшить скрипт - пожалуйста пишите, сделается новая версия.