PDA

Просмотр полной версии : Библиотеки, Классы, полезные функции.


Sharky
29.09.2009, 20:46
Выкладываем полезные классы, библиотеки, для облегчения жизни. Так же в теме принимаются просьба на поиски библиотек/классов. Начну первый:

MultiCurl class library

MultiCurl - библиотека классов, выполненная на базе MULTI CURL PHP extension. Имеет дополнительную функциональность:

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

К примеру, можно стартовать 100 закачек в 2 параллельных потока, скачивая только первые 100 Kb в каждой закачке.

Ссылки по классу:
http://www.weblancer.net/users/tvv/portfolio/231798.html
http://code.google.com/p/multicurl-library/downloads/list

Sharky
05.11.2009, 16:06
подскажите perl либу для работы с фтп через socks5

Pashkela
05.11.2009, 16:11
ftp://ftp.linux.it/debian/pool/main/libi/libio-socket-socks-perl/libio-socket-socks-perl_0.1.orig.tar.gz

b3
14.12.2009, 22:09
Т.к. тема не пользовалась спросом, немного изменил её направление, изменения в первом посте. Продолжу:

Класс для постраничного вывода из БД:


<?php
class Paging {

private $page_size = 10;
private $link_padding = 10;
private $page_link_separator = ' ';
private $next_page_text = 'следующая →';
private $prev_page_text = '← предыдущая';
private $result_text_pattern = 'Показано с %s по %s из %s';
private $page_var = 'p';

private $db;
private $q;
private $total_rows;
private $total_pages;
private $cur_page;

public function __construct($db, $q='', $page_var='p')
{
$this->db = $db;
if ($q) $this->set_query($q);
$this->page_var = $page_var;
$this->cur_page = isset($_GET[$this->page_var]) && (int)$_GET[$this->page_var] > 0 ? (int)$_GET[$this->page_var] : 1;
}

public function set_query($q)
{
$this->q = $q;
}

public function set_page_size($page_size)
{
$this->page_size = abs((int)$page_size);
}

public function set_link_padding($padding)
{
$this->link_padding = abs((int)$padding);
}

public function get_page($q='')
{
if ($q) $this->set_query($q);

$r = $this->db->query( $this->query_paging($this->q) );
$this->total_rows = array_pop($this->db->query('SELECT FOUND_ROWS()')->fetch_row());

if ($this->page_size !== 0) $this->total_pages = ceil($this->total_rows/$this->page_size);

if ($this->cur_page > $this->total_pages)
{
$this->cur_page = $this->total_pages;
if ( $this->total_pages > 0 ) $r = $this->db->query( $this->query_paging($this->q) );
}

return $r;
}

public function get_result_text()
{
$start = (($this->cur_page-1) * $this->page_size)+1;
$end = (($start-1+$this->page_size) >= $this->total_rows)? $this->total_rows:($start-1+$this->page_size);

return sprintf($this->result_text_pattern, $start, $end, $this->total_rows);
}

public function get_page_links()
{
if ( !isset($this->total_pages) ) return '';

$page_link_list = array();

$start = $this->cur_page - $this->link_padding;
if ( $start < 1 ) $start = 1;
$end = $this->cur_page + $this->link_padding-1;
if ( $end > $this->total_pages ) $end = $this->total_pages;

if ( $start > 1 ) $page_link_list[] = $this->get_page_link( $start-1, $start - 2 > 0 ? '...' : '' );
for ($i=$start; $i <= $end; $i++) $page_link_list[] = $this->get_page_link( $i );
if ( $end + 1 < $this->total_pages ) $page_link_list[] = $this->get_page_link( $end +1, $end + 2 == $this->total_pages ? '' : '...' );
if ( $end + 1 <= $this->total_pages ) $page_link_list[] = $this->get_page_link( $this->total_pages );

return implode($this->page_link_separator, $page_link_list);
}

public function get_next_page_link()
{
return isset($this->total_pages) && $this->cur_page < $this->total_pages ? $this->get_page_link( $this->cur_page + 1, $this->next_page_text ) : '';
}

public function get_prev_page_link()
{
return isset($this->total_pages) && $this->cur_page > 1 ? $this->get_page_link( $this->cur_page - 1, $this->prev_page_text ) : '';
}

private function get_page_link($page, $text='')
{
if (!$text) $text = $page;

if ($page != $this->cur_page)
{
$reg = '/((&|^)'.$this->page_var.'=)[^&#]*/';
$url = '?'.( preg_match( $reg, $_SERVER['QUERY_STRING'] ) ? preg_replace($reg, '${1}'.$page, $_SERVER['QUERY_STRING']) : ( $_SERVER['QUERY_STRING'] ? $_SERVER['QUERY_STRING'].'&' : '' ).$this->page_var.'='.$page);
return '<a href="'.$url.'">'.$text.'</a>';
}
return '<span>'.$text.'</span>';
}

private function query_paging()
{
$q = $this->q;

if ($this->page_size != 0)
{
//calculate the starting row
$start = ($this->cur_page-1) * $this->page_size;
//insert SQL_CALC_FOUND_ROWS and add the LIMIT
$q = preg_replace('/^SELECT\s+/i', 'SELECT SQL_CALC_FOUND_ROWS ', $this->q)." LIMIT {$start},{$this->page_size}";
}

return $q;
}
}
?>


Ссылки по классу:
https://forum.antichat.ru/showpost.php?p=1739576&postcount=2
http://www.tigir.com/paging.htm

life_is_shit
14.12.2009, 22:12
а можно мне хоть глазком глянуть на нормальный Doctrine ORM для codeigniter? :(
просто мечтаю в поллюционных снах.

b3
21.01.2010, 22:14
Класс для работы с MySQL:

<?php

class db
{
var $db_id = false;
var $query_num = 0;
var $query_list = array();
var $mysql_error = '';
var $mysql_error_num = 0;
var $MySQL_time_taken = 0;

function connect($db_user, $db_pass, $db_name, $db_location = 'localhost', $show_error=1)
{
if(!$this->db_id = @mysql_connect($db_location, $db_user, $db_pass))
{
if($show_error == 1) $this->display_error(mysql_error(), mysql_errno());
else return false;
}

if(!@mysql_select_db($db_name, $this->db_id))
{
if($show_error == 1) $this->display_error(mysql_error(), mysql_errno());
else return false;
}

return true;
}

function query($query, $show_error=true)
{

if(!$this->db_id) $this->connect(DBUSER, DBPASS, DBNAME, DBHOST);

if(!($result = mysql_query($query, $this->db_id) ))
{
$this->mysql_error = mysql_error();
$this->mysql_error_num = mysql_errno();

if($show_error) $this->display_error($this->mysql_error, $this->mysql_error_num, $query);
}

$this->query_num ++;

return $result;
}

function get_row($query_result)
{
return mysql_fetch_assoc($query_result);
}

function get_array($query_result)
{
return mysql_fetch_array($query_result);
}


function super_query($query, $multi = false)
{
if(!$this->db_id) $this->connect(DBUSER, DBPASS, DBNAME, DBHOST);

if(!$multi) return $this->get_row($this->query($query));
else
{
$query_result = $this->query($query);

$rows = array();
while($row = $this->get_row($query_result))
{
$rows[] = $row;
}

return $rows;
}
}

function num_rows($query_result)
{
return mysql_num_rows($query_result);
}

function insert_id()
{
return mysql_insert_id($this->db_id);
}

function get_result_fields($result)
{
while ($field = mysql_fetch_field($result))
{
$fields[] = $field;
}

return $fields;
}

function close()
{
@mysql_close($this->db_id);
}

function display_error($error, $error_num, $query = '')
{
if($query)
{
$query = preg_replace("/([0-9a-f]){32}/", "********************************", $query);
$query_str = "$query";
}

echo '<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>MySQL Fatal Error</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
<!--
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-style: normal;
color: #000000;
}
-->
</style>
</head>
<body>
<font size="4">MySQL Error!</font>
<br />------------------------<br />
<br />

<u>The Error returned was:</u>
<br />
<strong>'.$error.'</strong>

<br /><br />
</strong><u>Error Number:</u>
<br />
<strong>'.$error_num.'</strong>
<br />
<br />

<textarea name="" rows="10" cols="52" wrap="virtual">'.$query_str.'</textarea><br />

</body>
</html>';

exit();
}
}

?>

nerezus
21.01.2010, 23:33
b3, зверюга )
Никаких проверок, исключений, никакого ООП, просто обертка стандартных устаревших функций для работы с MySQL своими функциями )

VDShark
21.01.2010, 23:35
http://highcharts.com/
JS-библиотека для построения графиков/диаграмм и прочего-прочего со всякими вкусностями =)
Плотно не юзал, но выглядит удобоваримо.

b3
22.01.2010, 01:39
b3, зверюга )
:D исправлюсь)) Просто перенес с другого раздела тему, и нужно было апнуть =) Но кстати данным классом пользуюсь =) Для тех кому нужен "безопасный" класс могу посоветовать выдрать с DLE, там неплохой =)

Shadow_p1raT
22.01.2010, 06:42
уважаемый nerezus,не могли бы вы выложить настоящий класс для работы с mysql(т.е c OOП,исключениями,проверками )
P.S хочется глянуть )

astrologer
22.01.2010, 06:58
уважаемый nerezus,не могли бы вы выложить настоящий класс для работы с mysql(т.е c OOП,исключениями,проверками )
P.S хочется глянуть ) in b4 Zend_Db

life_is_shit
22.01.2010, 07:52
b3, джедай хуле=)
давно пора (по-доброму) переходить на orm или хотя бы active record.

m0Hze
22.01.2010, 09:19
in b4 Zend_Db
+5, это самое лучшее что я встречал.
Насчет дебага,можно использовать что то вроде вот этого,я это юзаю в смовем класе,тогда еще долго не мог отловить строку,без передачи LINE,FILE непосредственно в ф-цию.

function GetError()
{
if (!$this->debug) {
return (die());
}
$bg = debug_backtrace();
$error = '<body style="background-color:#6699FF;color:black"><h1 align="center" color="red">MySQL Error!</h1><br>
<ul><b>File:</b><error style="background-color:white;"><b>&nbsp;&nbsp;&nbsp; ' .
$path = ((!$this->path_error) ? basename($bg[1]['file']) : $bg[1]['file']) .
'<b></error><br><b>Line</b>: <error style="background-color:white;"><b>&nbsp;&nbsp;&nbsp;' .
$line = ((!$this->line_error) ? 'Admin Line Hidden' : $bg[1]['line']) .
'</b></error><br><b>Function:</b><error style="background-color:white;"> <b>[$mmysql->' .
$bg[1]['function'] .
'()]</b></error><br><b>Text error:<br> <textarea rows="10" cols="25" style="background-color:white;"> ' .
$ms = ((!$this->ms_error) ? 'Admin Query Hidden ' : mysql_error()) .
'</textarea><br></ul></div>';
die($error);

return true;
}
Дада,у меня все тоже очень криво,но как пример для более менее сносной отладки оно подойдет.Лучше чем передавать в каждую ф-цию линию и ффайл,или вообще без этого выводить.
Кстате, б3.

$query = preg_replace("/([0-9a-f]){32}/", "********************************", $query);
$query_str = "$query";

реально джедай :D

nerezus
22.01.2010, 13:55
уважаемый nerezus,не могли бы вы выложить настоящий класс для работы с mysql(т.е c OOП,исключениями,проверками )
P.S хочется глянуть ) Не вопрос (http://framework.zend.com/manual/ru/zend.db.html)

joks
22.04.2010, 14:38
Предисловаие:

Начинаю потихоньку выкладывать свои классы в этом разделе. Они будут идти с пометкой jClass. Думаю многим кодерам они пригодяться.

jClass: pWeb

Это класс для работы с сайтами в скриптах PHP. Он очень удобен для создания всевозможных авторегистраторов, парсеров, спамеров, граберов, брутфорсов итп. Основан на cURL, имеет много полезных возможностей, таких как:

Быстрая загрузка страниц методом GET и POST
Парсинг HTML
Нахождение любого HTML элемента и получения его аттрибутов (в.т.ч. inputs)
Автоматическое слежение за cookies
Парсер заголовков
Автоматическая загрузка каритинок
Разгадка капчи одной строкой кода, через Antigate
Ну и еще много чего интересного..


Скачать pWeb (версия 1.3) + документация и примеры (http://files.xxxgeneration.ru/files/2010_04_22/c52fb9/pWeb-1.3.rar) (http://files.xxxgeneration.ru/files/2010_04_22/c52fb9/pWeb-1.3.rar)


С помощью данного скрипта даже новичкам будет легко писать разные скрипты для интеграции с сайтами, уже не говоря о том, как он поможет профессионалам своего дела. В нем главное разобраться. Это как IDE, с первого взгляда кажется как все сложно и непривычно, а потом не можешь без нее жить.

Я использую этот класс в каждом своем проекте, работающем с сайтами. Предоставляю и вам такую возможность.

Разрешено использовать класс в любых ваших проектах, также продавать его как часть проекта. Одно условие - сохранение копирайта.

Если класс вам НЕ понравился, считаете его бажным итп, можете не писать здесь об этом, а просто им не пользоваться. Если нашли какуюто багу, то исправьте ее сами и выложите сюда пофиксеную версию. Буду признателен. Этот класс прошел много испытаний в тяжелых условиях и исправлено большое кол-во баг.

Скоро может выложу еще пару готовых примеров его использования. Пока работы много.

by m0Hze: На отдельную тему не тянет, клади сюда. Флуд почистил, что бы больше такого не было.