readmore за php

От: readmore за php

Обясни по-подробно каква е идеята.
 
От: readmore за php

Обясни по-подробно каква е идеята.

статия примерно има 2000букви да се показват 400-500, а другите да се показват след натискането на readmore бутон за PHP става въпрос.
 
От: readmore за php

Е прави height на div-a примерно 50 пиксела, което ще показва 400-500 знака. Като се натисне бутон "read more" да ти прави height-a на auto и ще си готов. Чист javascript без плугини, че даже можеш и само с css да го сториш.
 
От: readmore за php

PHP изпълнява от сървъра, JS се изпълнява от браузара.
Да не говориш за AJAX?! Или пък от страница А с резюме на текста и бутон readmore да се ходи на страница Б с целия текст?
 
От: readmore за php

Е прави height на div-a примерно 50 пиксела, което ще показва 400-500 знака. Като се натисне бутон "read more" да ти прави height-a на auto и ще си готов. Чист javascript без плугини, че даже можеш и само с css да го сториш.

дай примера

PHP изпълнява от сървъра, JS се изпълнява от браузара.
Да не говориш за AJAX?! Или пък от страница А с резюме на текста и бутон readmore да се ходи на страница Б с целия текст?

с PHP няма ли да стане това?
Не на същата страница просто текста да излиза с примерно: 200 думи и като натиснеш бутон show content или readmore да се показва целият текст и съответно бутон за hide content.
 
От: readmore за php

Ами ето тук за да вземеш първите Х думи ще ползваш PHP-то:

Примерно: http://stackoverflow.com/questions/5956610/how-to-select-first-10-words-of-a-sentence
function get_words($sentence, $count = 10) {
preg_match("/(?:\w+(?:\W+|$)){0,$count}/", $sentence, $matches);
return $matches[0];
}

Това дето го вземеш като първите 200 думи му правиш strlen и гледаш колко е дълго. От тази позиция до края ти е read mode текста.
 
От: readmore за php

Обаче всички тия калкулации на сървъра, може да му дойде множко при големи статии и много посетители. По принцип като се пише статия още при съставянето се отделя краткия текст от целия, но ако все пак е възможен само целия аз бих търсил решение с JavaScript
 
От: readmore за php

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

Човек, ще вземе да ти повярва някои и ще почне да пише някакви измислени скриптове :)
 
От: readmore за php

Човек, ще вземе да ти повярва някои и ще почне да пише някакви измислени скриптове :)
JS мие малко зор, но няма смисъл да се намесва PHP тук.
 
От: readmore за php

Да, в случая си е изцяло за JS. Имах в предвид твърдението на колегата, че сървъра много ще се затрудни с калкулацията за отрязване на текст...
 
От: readmore за php

Ей затва се прави бенчмарк. Ето го моя:

function get_words($string, $count = 10) {
$retval = [];
$pieces = explode(" ", $string);
$retval[0] = implode(" ", array_splice($pieces, 0, $count));
$retval[1] = implode(" ", array_splice($pieces, $count));
return $retval;
}

function get_words2($string, $count = 10) {
$words = explode(" ", $string);
$first = join(" ", array_slice($words, 0, $count));
$rest = join(" ", array_slice($words, $count));
return [$first, $rest];
}

$txt="";
for($i=0; $i<1000; $i++)
{
$txt.=" дума";
}

$t = microtime(true);

for($i=0; $i<1000; $i++)
{
get_words($txt, 200);
}

echo (microtime(true)-$t)."<br>";

$t = microtime(true);

for($i=0; $i<1000; $i++)
{
get_words2($txt, 200);
}

echo (microtime(true)-$t)."<br>";

Понеже кода дето е предложен горе нещо не ми работи, макар че е по-бърз от тия дето ще покажа, сглобих две пробни функции по предложения от тук: http://stackoverflow.com/questions/...best-way-to-get-the-first-5-words-of-a-string

Тук твърдят, че средната дължина на един блог пост е 2416 думи, но вероятно това включва еднобуквени думички, та аз избрах 1000 думи само с 4 букви: http://www.copypress.com/blog/4-statistics-every-blogger-should-know-about-content-word-count/

От друга страна тук твърдят, че "Longer content gets shared more", тъй че що да се ограничаваме: http://www.quicksprout.com/2014/03/31/how-long-should-each-blog-post-be-a-data-driven-answer/

Един блог обикновено показва по няколко поста наведнъж. Може да са 5, може да са 10. Един човек ако отвори страницата, значи текстообработката ще се повтори 5-10 пъти. Освен ако няма някакъв кеш де, но да приемам че няма. Също много зависи и от трафика в момента, но ей така за примера избрах пак хубавото число 1000 като брой обработки.

На моята машина времената за обработка на тия текстове са някъде около 0.4 секунди за първия вариант и 0.5 секунди за втория. Има вероятност в реална ситуация да е по-зле, все пак тук правя едно и също нещо с един и същи текст (PHP може би си има собствени кешове). Та пак бих предпочел да прехвърля тая задача на JavaScript.
 
От: readmore за php

Правил съм го това нещо с PHP ама малко по по друг начин. Когато записвам големия текст в таблицата от базата , записвам в друго специално създадено за целта поле, първите 10 или 20 или колкото си искаш думи в това поле.
После се визуализира в страницата това поле като накрая му добавям и един a tag с уникално id .
Написал съм си и една функция на JavaScript която се вика при click на въпросния a tag и която взема с Ajax целия текст , трие съдържанието на родителя на a tag а и го замества с пълния текст.
Използвам го това когато в една страница трябва да се зареждат много такива текстове (one page design).
Резултата е че страницата се зарежда по бързо а и PHPто не се товари щото тая малка част от текста съм я записал още при въвеждането на текста
 
От: readmore за php

Двете ти функции са почти еднакви, така че няма какво да ги делиш. Според моя бенчмарк, твоята функция е около 15 пъти по-бавна от моята при 100000 итерации:

get_words1 - total time: 1.135065, iterations: 100000, average time: 0.000011
get_words2 - total time: 17.017973, iterations: 100000, average time: 0.000170

Ето и самия код
<?php

function get_words1($sentence, $count = 10) {
preg_match("/(?:\w+(?:\W+|$)){0,$count}/", $sentence, $matches);
return $matches[0];
}

function get_words2($string, $count = 10) {
$words = explode(" ", $string);
$first = join(" ", array_slice($words, 0, $count));
$rest = join(" ", array_slice($words, $count));
return [$first, $rest];
}

$file = file_get_contents('lorem.txt');

$time1start = microtime(true);
for ($i=0; $i<100000; $i++)
{
$words = get_words1($file);
}
$time1end = microtime(true);
$msg = sprintf("get_words1 - total time: %f, iterations: %d, average time: %f",
$time1end - $time1start, 100000, ($time1end - $time1start) / 100000);
echo $msg . '<br/>';

$time2start = microtime(true);
for ($i=0; $i<100000; $i++)
{
$words = get_words2($file);
}
$time2end = microtime(true);
$msg = sprintf("get_words2 - total time: %f, iterations: %d, average time: %f",
$time2end - $time2start, 100000, ($time2end - $time2start) / 100000);
echo $msg . '<br/>';

Иначе за да симулираш истинско сървърно натоварване слагаш всяка функция в отделен файл и с ab туул-а на апачето си мериш кога ще спре да ти отговаря.

C:\>ab -n 100 -c 10 http://localhost/testwords1.php
This is ApacheBench, Version 2.3 <$Revision: 1554214 $>

Benchmarking localhost (be patient).....done

Server Software: Apache/2.4.9
Server Hostname: localhost
Server Port: 80

Document Path: /testwords1.php
Document Length: 82 bytes

Concurrency Level: 10
Time taken for tests: 78.107 seconds
Complete requests: 100
Failed requests: 9
(Connect: 0, Receive: 0, Length: 9, Exceptions: 0)
Total transferred: 26909 bytes
HTML transferred: 8209 bytes
Requests per second: 1.28 [#/sec] (mean)
Time per request: 7810.747 [ms] (mean)
Time per request: 781.075 [ms] (mean, across all concurrent requests)
Transfer rate: 0.34 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 0.4 1 1
Processing: 6952 7776 1079.6 7290 11309
Waiting: 6952 7776 1079.5 7290 11309
Total: 6953 7777 1079.6 7290 11310

Percentage of the requests served within a certain time (ms)
50% 7290
66% 7380
75% 8247
80% 8279
90% 9782
95% 10219
98% 11032
99% 11310
100% 11310 (longest request)

И бавната функция:

C:\>ab -n 100 -c 10 http://localhost/testwords2.php
This is ApacheBench, Version 2.3 <$Revision: 1554214 $>

Benchmarking localhost (be patient)...apr_pollset_poll: The timeout specified ha
s expired (70007)
 
Последно редактирано:
От: readmore за php

Я тествайте сега и тази :)

function trimText($string, $character){
$text = $string;
$trim = substr($string,0,$character);
$trim = substr($trim,0,strrpos($trim," "));
$rest = substr($text, strlen($trim));
return array($trim, $rest);
}

$txt="";
for($i=0; $i<1000; $i++)
{
$txt.=" дума".rand();
}

$t = microtime(true);

for($i=0; $i<1000; $i++)
{
trimText($txt, 200);
}
echo ((microtime(true)-$t)*1000)."<br>";
 
От: readmore за php

Твоята идва около 2 пъти по-бавна от варианта с регулярния израз.
 
От: readmore за php

При мен минава за 3ms, а функцията на AseasRoa ми дава 400ms.

Както и да е, няма значение толкова, много се отплеснахме от темата на човека :)

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

Но всичко това няма общо с темата :)
 
От: readmore за php

Само на мен ли regex-a на Георги не ми работи?

preg_match("/(?:\w+(?:\W+|$)){0,2}/", "бла бла бла бла бла бла", $matches);
print_r($matches);

Това нещо ми връща: Array ( [0] => )

Но както и да е, човек може цял ден да си прави проверки и да търси най-доброто парче код за PHP. На мен идеята ми беше, че ако някой не обръща толкова сериозно внимание, може да гепи един простичък работещ код от някъде и да си свирка на първо време. Аз поне се съмнявам автора на темата да тръгне да бенчмарква. И като се насложат нещата, кода като нищо може да се окаже натоварващ за сървъра. Що да товарим сървъра излишно?

Но и да не е товарещо, що пък да усложняваме нещата :)
Скрипта дето автора е показал ми се вижда добро решение. Текста си се доставя целия, скрива се с overflow:hidden и при нужда се открива :)
 

Горе