PHP скрипт за генериране на RSS

KOBRETI

New member
Понеже знам колко е неприятно като не знаеш точно какво има в РСС-а, че да си го напишеш сам, а всички готови решения все нещо не са точно както искаш, реших да споделя скрипта, който съм си писал сам и си ползвам от доста време...

Целия скрипт можете да свалите от тук

Общо взето можете да го сложите нвсякъде, ако ще и някакъв готов ЦМС да е, само трябва да погледнете през cPanel точно в коя таблица и кои колони се намира съответната информация...

Сега част по част 🙂

Почваме със сдандартен код за линкване с базата данни
PHP:
<?php
	$db_conn = mysql_connect ("localhost", "-------DB_USER--------", "--------DB_PASS---------"); 
 
	if (!$db_conn) {
		echo "Database connection error. Please try again later.";
		exit;
	}
	mysql_select_db ("--------DB_NAME------------");

Правим заявка към базата за съответната информация. В случая дърпам последните 30 новини. За всеки случай четем колко записа са върнати.
PHP:
	$query = 'SELECT * FROM novini ORDER BY nvn_data DESC LIMIT 0, 30'; 
	$result = mysql_query($query);
	$num_rows = mysql_num_rows($result);

Взимаме текущото време, за да укажем кога е генериран РСС-ът
PHP:
	$n_dt = date('r', time());

В променливата $rss почваме да добавяме съдържание, в началото хедърите на РССа. Сега виждам, че е останал някакъв xsl, ама както и да е 🙂
PHP:
	$rss = '
		<?xml version="1.0" encoding="utf8"?><?xml-stylesheet type="application/rss+xml" href="http://rss1.mediafed.com/xsl/autosport/rss.xsl"?>
		<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
		<channel>

Пишем общите неща за канала. В lastBuildDate пишем датата, която по-горе присвоихме. Вижте и как съм направил годините на копирайта, за да си се сменя автоматично всяка година...
PHP:
			<atom:link href="http://auto-kart.com/rss.xml" rel="self" type="application/rss+xml" />
			<title>Българският картинг портал</title>
			<description>Подробна информация за света на картинга</description>
			<link>http://auto-kart.com</link>
			<language>bg</language>
			<copyright>(c) 2009-'.date("Y").' auto-kart.com</copyright>
			<ttl>60</ttl>
			<lastBuildDate>'.$n_dt.'</lastBuildDate>

Слагаме и изображение за канала
PHP:
			<image>
				<title>Българският картинг портал</title>
				<url>http://auto-kart.com/img/img_header2.jpg</url>
				<link>http://auto-kart.com</link>
			</image>
	';

Тук спираме писането, и почваме да извличаме данните от базата. За всяка новина id, дата, заглавие
PHP:
	for ($i=0; $i < $num_rows; $i++) {
		$row = mysql_fetch_array($result);
		$n_id = sprintf("%03d",$row['nvn_id']);
		$n_dt = date('r', strtotime($row['nvn_data'])); 
		$n_title = stripslashes($row['nvn_zaglavie']);

После от таблицата със снимките дърпам първата снимка към новината. Ако няма снимка, задавам служебна картинка
PHP:
		$p_query = 'SELECT * FROM novini_snimki WHERE nvs_novina='.$n_id;
		$p_result = mysql_query($p_query);
		$p_num_rows = mysql_num_rows($p_result);
		if ($p_num_rows > 0) {
			$p_row = mysql_fetch_array($p_result);
			$p_pic = $p_row['nvs_snimka'];
		} else {
			$p_pic = "noimage.jpg";
		}	
		$n_img = $p_pic;

Тук си дърпам първите 300 символа от текста. Може малко да се подобри, за да не добавя многоточие, ако целия текст е под 300 знака.
PHP:
		$n_text = "<br />".substr(trim(strip_tags($row['nvn_tekst']), " "), 0, 300)."...";

Добавям в променливата $rss новините чрез цикъла
PHP:
		$rss .= '
			<item><guid isPermaLink="true">http://auto-kart.com/novina.php?id='.$n_id.'</guid>
				<title>'.$n_title.'</title>
				<description><![CDATA[<img width="100" alt="" src="http://auto-kart.com/novini/thumbs/'.$n_img.'">]]><![CDATA['.$n_text.']]></description>
				<link>http://auto-kart.com/novina.php?id='.$n_id.'</link>
				<pubDate>'.$n_dt.'</pubDate>
			</item>
		';

Затварям цикъла и дописвам футъра на рсс-а
PHP:
	}
	
	$rss .= "</channel></rss>";

Изписваме генерирания РСС
PHP:
	echo $rss;

И ак някой се пита защо първо присвоявам на променлива, а пиша накрая, ето затова: записвам генерирания рсс във файл
PHP:
	$myFile = "rss.xml";
	$fh = fopen($myFile, 'w') or die("can't open file");
	fwrite($fh, $rss);
	fclose($fh);
?>

В случая не ползвам пренаписване, така че ако пренаписвате, ще трябват малко промени...

Надявам се да е било полезно на някой. Ако имате въпроси, казвайте.
 
Re: PHP скрипт за генериране на RSS

Кобрети, линкът ти за сваляне не работи и пише: Сваляне: rss.php | 0 MB

ЕДИТ

Извинявай, моя грешка, ама очаквах да сваля php, а не htm

ЕДИТ 2
Исках само да го пробвам, но се оказа, че изобщо не е така просто да го пригодиш - трябва да се направят промени на линкове и заявки на доста места. Писна ми и го зарязах.
Моят е на 1/3 от обема на кода, ама си ми върши работа и съм доволен.
 
Последно редактирано:
Re: PHP скрипт за генериране на RSS

Само за информация на авотра - доста неоптимизиран код, ако се ползва в големи БД този код ще работи БАВНО и ще хаби залудо ресурси на MySql.
Кодът в този му вид е подходящ за слабо посещавани сайтове и малко записи в БД. 🙂
 
Последно редактирано:
Re: PHP скрипт за генериране на RSS

Само за информация на авотра - доста неоптимизиран код, ако се ползва в големи БД този код ще работи БАВНО и ще хаби залудо ресурси на MySql.
Кодът в този му вид е подходящ за слабо посещавани сайтове и малко записи в БД. 🙂
А, ти още си ми обиден, че ти писах в темата за напреднали... Би ли бил така добър да ми покажеш точно коя от 2-те SQL заявки, използващи единствена таблица, може да се оптимизира и как... Но ако искаш, може вместо да ми отговориш на въпроса, да продължиш да се заяждаш, както и очаквам...
 
Re: PHP скрипт за генериране на RSS

Ще ти отговоря естествено, просто се изисква малко логика, и всеки би се досетил как да направи оптимизиацията 🙂, и не съм обиден, а просто не мога да разбера що за приом е да пишеш глупости по теми под формата на роман. За разлика от твоя отговор тук може да научиш нещо.


Когато ползваш някое поле за сортиране в големи бази заявката "SELECT FROM TABLE ORDER BY FIELD" почва да става много тромава и бавна. Решението е да се ползва някое индексирано поле и да се смали броя на записите, които ще се сортират. Ако си мислиш че "LIMIT" допринася нещо за това, то си в голяма заблуда.


1. Изпълняваш следната заявка: "select max('id') as max_id from table", където "id" е primary index-a.

2. "SELECT * FROM TABLE WHERE id>(".$max_id."-30) ORDER BY FIELD" - за последните 30 резултата.

Елементарно нали 🙂

Също така ще ти препоръчам да използваш колкото се може по малко заяваки. Редът "$num_rows = mysql_num_rows($result);" е излишен, както и цикъла "FOR". Много по удачно е да ползваш веднага след заявката:

$result=mysql_query($sql);
while($row=mysql_fetch_array($result, MYSQL_ASSOC)) {

}

За записа на резултатите във файл просто не мога да го проумея що за метод е - допълнително се натоварва файловата система и е доста бавно. Ако се притесняваш, че някой може да ти открадне скъпоценния код от "rss.xml", то можеш да го кръстиш "rss.php" или пък в .htaccess -> "AddType application/x-httpd-php5 .xml"

Като заключение ще кажа, че тези малки промени в голяма БД са много съществени и могат да спестят ДОРИ СЕКУНДИ(не милисекунди) при изпълнение на файла.
 
Последно редактирано:
Re: PHP скрипт за генериране на RSS

krapo, изписа една плява глупости😉
Първо от къде си сигурен, че "nvn_data" не е ключ?
Второ това с "where id>".($max_id-30) е още по-голяма простотия - от къде си сигурен, че id-тата в таблицата са подредени хронологично и съвпадат с подредбата на nvn_data?
Трето забелязвам, че даже не си наясно какви функции за mysql има в PHP, би трябвало да знаеш за съществуването на mysql_fetch_assoc(). Също така забележката ти за броя на заявките е неуместна и невярна! Няма значение броя на заявките, а бързината на изпълнението им! По-добре да имаш 10 заявки, които сумарно се изпълняват по-бързо от една - много често е по-добре да имаш 10 заявки, отколкото да правиш join на големи таблици.
 
Re: PHP скрипт за генериране на RSS

Хе хе

1. Тук говорим за rss - обикновено там се слагат последните теми, така че метода е най удачен. Ако ти слагаш в rss-a си някакви други резултати, а не последните и за това си има решение.

2. Дори "nvn_data" да е ключ - по бързия метод е моя

3. "Куп глупости" можеш да говориш само, ако изследвал различните заявки, а не да ми говориш спрямо това какво ти мислиш. Обикновено отворковците като теб дето много мислят нищо не постигат и те са тези, които пишат глупости и стават за смях.

4. Тези като теб дето знаят единствено да учат на изуст, без да могат иначе да вникнат в проблема и лишени от всякаква логика съм ги виждал какво могат на практика, докато учех още - тръгнал да ми се прави на отворен, че знаел функцията "mysql_fetch_assoc()" - страшно ме респектира с тези неворятни знания - ахахаххахахах, а и не рабрах точно къде има join на друга таблица.
Всъщност ако искаш можеш да отидеш на функции в php.net, да направиш copy -> paste и да покажеш на всички какви още знания имаш освен "mysql_fetch_assoc()".

5. Понеже виждам че си "ГУРУ" в този форум, най-вероятно ще получищ огромна подкрепа от твоите почитатели, за да подхранят егото ти, но това въобще няма да ме впечатли.

П.С. Сега прегледай много внимателно текста ми за правописни грешки и напиши "първо се научи да пишеш", като не пропуснеш да упоменеш къде са ми грешките - аахахахах
 
Последно редактирано:
Re: PHP скрипт за генериране на RSS

Излишни са тези нападки. Ако имате лични конфликти си ги решете другаде.
Показаният код + това че има пояснение е много добре. Много хора тук имат нужда от това. Аз досега не съм срещал примери в които да не може да се каже, че нещо може да се промени в тях. Важното е да има някаква идея и насока а от там нататък ... кой както желае.
Като цяло - подкрепям това да се дават примери тук.
 
Re: PHP скрипт за генериране на RSS

Когато ползваш някое поле за сортиране в големи бази заявката "SELECT FROM TABLE ORDER BY FIELD" почва да става много тромава и бавна. Решението е да се ползва някое индексирано поле и да се смали броя на записите, които ще се сортират. Ако си мислиш че "LIMIT" допринася нещо за това, то си в голяма заблуда.

1. Изпълняваш следната заявка: "select max('id') as max_id from table", където "id" е primary index-a.
2. "SELECT * FROM TABLE WHERE id>(".$max_id."-30) ORDER BY FIELD" - за последните 30 резултата.
Елементарно нали 🙂
Да, това също е вариант, но не мисля, че твърдението ти е вярно относно LIMIT.
Цитат от http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html
If you use LIMIT row_count with ORDER BY, MySQL ends the sorting as soon as it has found the first row_count rows of the sorted result, rather than sorting the entire result. If ordering is done by using an index, this is very fast.
Ще се сортира цялата база само ако не е използван индекс, така че в случая LIMIT върши идеална работа.

Също така ще ти препоръчам да използваш колкото се може по малко заяваки. Редът "$num_rows = mysql_num_rows($result);" е излишен, както и цикъла "FOR". Много по удачно е да ползваш веднага след заявката:
$result=mysql_query($sql);
while($row=mysql_fetch_array($result, MYSQL_ASSOC)) {
}
При върнати 30 резултата, дали ще има 0,000001 сек печалба? Но принципно си прав, това е малко по-добре.

За записа на резултатите във файл просто не мога да го проумея що за метод е - допълнително се натоварва файловата система и е доста бавно. Ако се притесняваш, че някой може да ти открадне скъпоценния код от "rss.xml", то можеш да го кръстиш "rss.php" или пък в .htaccess -> "AddType application/x-httpd-php5 .xml"
Това го направих, защото на някои места не приема .php, а искат .xml... Можеш ли да дефинираш "доста бавно"?

Като заключение ще кажа, че тези малки промени в голяма БД са много съществени и могат да спестят ДОРИ СЕКУНДИ(не милисекунди) при изпълнение на файла.
ОК, значи можело да се води диалог. Затова е форум. Не съм казал, че това е хипер-ултра-супер-гига код за РСС. Просто го дадох като пример, ако някой тръгне да си пише собствен. По-ценното в него е не как са написани заявките, защото всяка база ще е различна и така или иначе там ще трябва да се пипа. Въпросът е да даде насока и начална точка на някой, който се опитва да си напише такова нещо. А и да покаже какво трябва да се изведе във фийда.

Така че оптимизациите ти са ок, макар че за сайтовете, в които аз го ползвам, разлика няма да се усети. Нека другите ги имат предвид.
 
Последно редактирано:
Re: PHP скрипт за генериране на RSS

Под "доста бавно" имам пред вид сумарно като се вземат посещенията на сайта ти + ботовте. Не е добра идея на всяко зареждане на хедъра да се генерира нов файл, пък било то и малък по размер. Това е излишно хабене на ресурси. Варианта с .htaccess е много по-добър при положение, че държиш да е .xml

По отношение на "LIMIT" и "WHERE" съм правил съпоставка в огромни бази и ако може да се използва "WHERE" с primary index в даден случай ми дава по добри резултати. Все пак като ключ при "WHERE" изплзвам primary index, a "LIMIT" с "ORDER BY" използва вторичен index
 
Последно редактирано:
Re: PHP скрипт за генериране на RSS

krapo, виждам че ти харесва да дрънкаш празни приказки и тъй като смята, че грешиш ще се опитам най-точно да ти обясня защо, въпреки че ме дразни начина ти на комуникация и личните нападки.

1. Тук говорим за rss - обикновено там се слагат последните теми, така че метода е най удачен. Ако ти слагаш в rss-a си някакви други резултати, а не последните и за това си има решение.
Ти виждал ли си някъде rss feed в който информацията излиза подредена на ID? На всякъде подредбата е по дата. Може би само в твоите фиидове?


Дори "nvn_data" да е ключ - по бързия метод е моя
Дори и да е по-бърз ще дава грешна информация, тъй като има възможност да има липсващи ID-та, а и няма гаранция, че подредбата по ID съвпада с подредбата по дата (виж 1).

3. "Куп глупости" можеш да говориш само, ако изследвал различните заявки, а не да ми говориш спрямо това какво ти мислиш. Обикновено отворковците като теб дето много мислят нищо не постигат и те са тези, които пишат глупости и стават за смях.
Дефинирам ги като глупости, тъй като не са оптимално решение на конкретния проблем, а подвеждащо и нерационално. Може да има и верни неща, но приложими за други случаи. Това, че заявките са бързи, не означава, че крайния резултат ще бъда очаквания. В случая понякога ще ти се получава правилен feed, друг път хронологично разбъркан, трети път вместо X на брой резултати ще имаш X-n.


Тези празни приказки и мерене на пишки няма да ги коментирам - няма да помогнат на никого в тази тема.
 

Back
Горе