PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (31): В начало « ... 3 4 5 6 [7] 8 9 10 11 ... » В конец

> Найдено сообщений: 463
Prizma Отправлено: 02 Марта, 2016 - 20:06:41 • Тема: Шаблонизатор страниц сайта • Форум: Объектно-ориентированное программирование

Ответов: 5
Просмотров: 1280
Мелкий пишет:
Запустите профилировщик и сравните.
Потом учтите в своём велосипеде циклы и условия и сравните ещё раз.

У меня была мысль так сделать) я Вас услышал, спасибо за советы
Prizma Отправлено: 02 Марта, 2016 - 18:47:49 • Тема: Шаблонизатор страниц сайта • Форум: Объектно-ориентированное программирование

Ответов: 5
Просмотров: 1280
Мелкий пишет:
В целом: не используйте static там где это не нужно. (сейчас прибежит LIME и скажет "никогда не используйте static")

Я люблю статик за то, что код становится как мне кажется более лаконичным, без создания экземпляра класса там где не нужно хранить каких то итогов или использовать его промежуточные результаты многократно.
Мелкий пишет:
Раз ищите теги всё равно регуляркой - сразу регуляркой их и заменяйте: preg_replace_callback. Зачем их потом искать ещё раз?

Мелкий пишет:
Взяли за основу синтаксис query param - ну и парсите их нативными средствами: parse_str

согласен, исправлюсь
Мелкий пишет:
Ни в коем случае. Это дико жрёт CPU.

а вот тут не совсем понял, что именно будет давать нагрузку?
К примеру если контент динамический, есть несколько десятков типов страниц (страница товара, страница html, страница категорий, страница новостей и мало ли еще какие) для генерации я планировал использовать этот класс, сначала на уровне шаблона, а потом на уровне крупных элементов в теле страницы (сомневаюсь что их будет больше 1-5 на одной странице).

В любом случае можно задействовать кэширование, но это уже другая песня. Интересно где именно будет цп грузиться я тоже думал об этом, но недопер видимо)) регулярка шустрая тем более искать там немного потом всё по сути переходит на switch и уже по нужной ветке верстается в момент. Или не так?
(Добавление)
PS: есть еще вариант например в ленте новостей прогонять через шаблон каждую новость к примеру может тогда возрастет нагрузка? хотя не знаю
esterio пишет:
тоже когда-то страдал той же фигней и понял что лучше использовать тот же твиг и будет мне счастье. Вот почему я бы Вам рекомендовал использовать готовые решения. Но если рука чешеться написать хоть и не такое функциональное но свое, то вперед.
да функционал там широкий и часто не востребованный, я интересуюсь готовыми решениями, однако часто они дают непредсказуемую нагрузку (хотя и достаточно редко и даже когда дают бывает, что от кривых рук, а не из-за решения)
(Добавление)
Использовал советы и совсем лаконично получилось, правда от статиков не ушел) ну уж очень они мне нравятся
PHP:
скопировать код в буфер обмена
  1. class TemplateLoader
  2. {
  3.     /**
  4.      * @param $template string (if load=true then use file_get_contents for $template)
  5.      * @param bool|true $load
  6.      * @return string (ready template)
  7.      */
  8.     static $cashResults = [];
  9.  
  10.     static public function loadTemplate($template, $load = true)
  11.     {
  12.         if($load) {
  13.             $t = $template;
  14.             $template = file_get_contents($t);
  15.             if(!$template) {
  16.                 throw new \LogicException(sprintf('Template was not found (%)', $t));
  17.             }
  18.         }
  19.         $template = preg_replace_callback('#{%[^%\}]*%}#ui', 'self::re', $template);
  20.         return $template;
  21.     }
  22.  
  23.     static protected function executeCommand($commandName, $params = [])
  24.     {
  25.         return '{%commnd was not found%}';
  26.     }
  27.  
  28.     static private function re($fullCommand)
  29.     {
  30.         $fullCommand = trim($fullCommand[0], '{}%');
  31.         if(isset(self::$cashResults[$fullCommand])) {
  32.             return self::$cashResults[$fullCommand];
  33.         }else{
  34.             $t = explode('?',$fullCommand);
  35.             if(count($t) > 2) {
  36.                 return '{syntax error}';
  37.             }else{
  38.                 $commandName = urldecode($t[0]);
  39.                 parse_str($t[1], $params);
  40.                 return static::executeCommand($commandName, $params);
  41.             }
  42.         }
  43.     }
  44. }
Prizma Отправлено: 02 Марта, 2016 - 16:38:27 • Тема: Шаблонизатор страниц сайта • Форум: Объектно-ориентированное программирование

Ответов: 5
Просмотров: 1280
Не так давно меня попросили добавить возможность на сайте интернет магазина вставлять информацию об одном товаре в описание другого (описание хранится в бд в виде текста). Я не долго думая написал класс для замены в html описании вхождений типа {%commandName?param1=x&param2=y%} на то что я хочу.

Сегодня я пошел дальше и решил написать класс который бы позволял все это использовать где угодно (для генерации шаблона, описания и всего чего только душа желает), как в шаблоны в популярных движках.

Как итог я получил класс, от которого наследуется пользовательский класс и в нем пишется только реализация самих команд. Правда пришлось использовать позднее статическое связывание(http://php.net/manual/ru/languag...tic-bindings.php ) с которым я раньше не работал и не знаю, что от него можно ожидать.

Хотел спросить ваше мнение, кто что думает по поводу реализация, применения, подводных камней?

Пример использования:
main.html - файл шаблона:
CODE (html):
скопировать код в буфер обмена
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="keywords" content="{%keywords%}">
  6.     <meta name="description" content="{%description%}">
  7.     <title></title>
  8. </head>
  9. <body>
  10. {%content%}
  11. </body>
  12. </html>

Example.php - пользовательский класс написанный на основе моего:
PHP:
скопировать код в буфер обмена
  1. class Example extends TemplateLoader
  2. {
  3.     /* Эта функция получает имя команды и параметры из шаблона и должна производить пользовательскую замену и является обязательной */
  4.     static protected function executeCommand($commandName, $params = [])
  5.     {
  6.         switch($commandName) {
  7.             case 'keywords':
  8.                 return 'my key words';
  9.             case 'description':
  10.                 return 'my key description';
  11.             case 'content':
  12.                 return self::generateContent();
  13.             default:
  14.                 return self::executeCommandNotFound($commandName);
  15.         }
  16.     }
  17.  
  18.     static private function generateContent()
  19.     {
  20.         return '<h1>content</h1>';
  21.     }
  22.     /* Тут можно сделать кучу своих методов */
  23. }

index.php - запускаемый файл:
PHP:
скопировать код в буфер обмена
  1. require_once 'TemplateLoader.php';
  2. require_once 'Example.php';
  3.  
  4. $t = __DIR__ . 'main.html';
  5. echo Example::loadTemplate($t)

Результат выглядит так:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <meta name="keywords" content="my key words">
  7.     <meta name="description" content="my key description">
  8.     <title></title>
  9. </head>
  10. <body>
  11. <h1>content</h1>
  12. </body>
  13. </html>
  14.  

TemplateLoader.php - класс шаблонизатора:
PHP:
скопировать код в буфер обмена
  1. class TemplateLoader
  2. {
  3.     /**
  4.      * @param $template string (if load=true then use file_get_contents for $template)
  5.      * @param bool|true $load
  6.      * @return string (ready template)
  7.      */
  8.     static public function loadTemplate($template, $load = true)
  9.     {
  10.         if($load) {
  11.             $t = $template;
  12.             $template = file_get_contents($t);
  13.             if(!$template) {
  14.                 throw new \LogicException(sprintf('Template was not found (%)', $t));
  15.             }
  16.         }
  17.         return self::executeTemplate(self::prepareCommandsInTemplate($template), $template);
  18.     }
  19.  
  20.     static protected function executeTemplate($prepareCommands, $template)
  21.     {
  22.         $search = [];
  23.         $replace = [];
  24.         foreach($prepareCommands as $commandSearchName => $prepareCommand) {
  25.             list($commandName, $params) = $prepareCommand;
  26.             $search[] = $commandSearchName;
  27.             $replace[] = static::executeCommand($commandName, $params);
  28.         }
  29.         return str_replace($search, $replace, $template);
  30.     }
  31.  
  32.     static protected function executeCommand($commandName, $params = [])
  33.     {
  34.         return '{%commnd was not found%}';
  35.     }
  36.  
  37.     static private function prepareCommandsInTemplate($template)
  38.     {
  39.         $regulars = self::searchRegular($template);
  40.         $re = [];
  41.         foreach($regulars as $templ) {
  42.             if(isset($re[$templ])) {
  43.                 continue;
  44.             }
  45.             $t = trim($templ,'%{}');
  46.             $t = explode('?',$t);
  47.             if(count($t) > 2) {
  48.                 $re[$templ] = '{syntax error}';
  49.             }else{
  50.                 $continue = false;
  51.                 $commandName = urldecode($t[0]);
  52.                 $params = [];
  53.                 if(isset($t[1]) && !empty($t[1])) {
  54.                     $t = explode('&',$t[1]);
  55.                     foreach($t as $param) {
  56.                         $p = explode('=', $param);
  57.                         if(count($p) === 2) {
  58.                             $params[urldecode($p[0])] = urldecode($p[1]);
  59.                         }else{
  60.                             $re[$templ] = '{syntax error in param}';
  61.                             $continue = true;
  62.                             break;
  63.                         }
  64.                     }
  65.                     if($continue) {
  66.                         continue;
  67.                     }
  68.                 }
  69.                 $re[$templ] = [$commandName, $params];
  70.             }
  71.         }
  72.         return $re;
  73.     }
  74.  
  75.     static private function searchRegular($template)
  76.     {
  77.         if(preg_match_all('#{%[^%\}]*%}#ui', $template, $re)) {
  78.             return $re[0];
  79.         }else{
  80.             return [];
  81.         }
  82.     }
  83. }



PS: У меня на него большие планы (в плане использования) поэтому интересуюсь вашим мнением, надеюсь камнями не забросаете). Может еще кому будет полезен.

PS2: планирую на его основе переписать генерацию страниц на сайте.
Prizma Отправлено: 25 Февраля, 2016 - 19:27:37 • Тема: Редирект с параметрами • Форум: Вопросы новичков

Ответов: 2
Просмотров: 189
vadokx пишет:
Возможно есть другие решения поставленной задачи?

А не проще просто перенаправить запросы через .htaccess на index.php и там смотреть переменную $_SERVER['REQUEST_URI'] которая всегда будет верной?
(Добавление)
.htaccess:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. RewriteEngine On
  3. Options +FollowSymlinks
  4. RewriteCond %{REQUEST_URI}
  5. RewriteRule   ^(.*) index.php

вроде так
Prizma Отправлено: 25 Февраля, 2016 - 19:25:07 • Тема: OpenId библиотека • Форум: Вопросы новичков

Ответов: 0
Просмотров: 65
Нужна библиотека для OpenId, нашел какой то старый видимо для первых версий класс, расковырял его, вытащил то что нужно, и вот дошел до этапа получения подтверждения от сервера, что да всё хорошо это тот парень за кого себя выдает.

Мне нужно сделать последний запрос к серверу который должен вернуть:
Цитата:

а он возвращает:
Цитата:


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

Может кто в курсе?

Или у кого то есть класс для php свежий для работы с openId
(Добавление)
Всё ок кажется разобрался)
ЗАКРЫТО
Prizma Отправлено: 25 Февраля, 2016 - 11:22:55 • Тема: Найти совпадения по всему файлу CSV • Форум: Вопросы новичков

Ответов: 5
Просмотров: 272
На здоровье Подмигивание
Prizma Отправлено: 25 Февраля, 2016 - 11:12:17 • Тема: Найти совпадения по всему файлу CSV • Форум: Вопросы новичков

Ответов: 5
Просмотров: 272
EpcMaster пишет:
Но код не рабочий. Выводит, что нет совпадений.

я код не проверял, сори там было пара серьезных ошибок)) вот этот проверил:
PHP:
скопировать код в буфер обмена
  1. $f = file_get_contents('base.csv');
  2. $ar = [];
  3. $pr = false;
  4. if(preg_match_all("#([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);#", $f, $re)) {
  5.     if(count($re[0]) > 0) {
  6.         for ($i = 0; $i < count($re[0]); $i++) {
  7.             $date = $re[1][$i];
  8.             $time = $re[2][$i];
  9.             $name = $re[3][$i];
  10.             $fam = $re[4][$i];
  11.             $lang = $re[5][$i];
  12.             $ip = $re[6][$i];
  13.             $par1 = $re[8][$i];
  14.             $par2 = $re[9][$i];
  15.             if (isset($ar[$ip])) {
  16.                 $ar[$ip]++;
  17.                 $pr = true;
  18.                 echo '<br>Найдено совпадение: ' . $ip;
  19.             } else {
  20.                 $ar[$ip] = 1;
  21.             }
  22.         }
  23.         if(!$pr) {
  24.             echo 'Совпадений не найдено';
  25.         }
  26.     }else{
  27.         echo 'Файл пустой или ошибка в регулярном выражении';
  28.     }
  29. }else{
  30.     throw new \LogicException('preg_match_all error');
  31. }
Prizma Отправлено: 25 Февраля, 2016 - 10:56:57 • Тема: Хранение баланса пользователей • Форум: Вопросы новичков

Ответов: 2
Просмотров: 308
Мелкий пишет:
Надеюсь, не просто begin/commit, а с пониманием где и что будет на конкурентном доступе?
Я вот тут более подробно писал: https://toster[dot]ru/q/273073#answer_716337

Прочитал Ваш пост, да эти грабли я использовал как ключ в одной игрушке к бесконечному балансу))

только там был косяк еще глубже баланс в минус загонялся при небольшом ддосе ну собственно та ситуация которая описана в посте.

Кстате подобную задачку я где то пару лет назад завалил на собеседовании))
(Добавление)
Спасибо за советы
Prizma Отправлено: 25 Февраля, 2016 - 09:41:42 • Тема: Найти совпадения по всему файлу CSV • Форум: Вопросы новичков

Ответов: 5
Просмотров: 272
EpcMaster пишет:
Нужно найти дубли пройдясь по всему файлу, после 5-го и до 6-го разделителя, условно говоря определенный кусок (выделил жирным шрифтом дубли).
Собственно код ниже, выводит везде "Совпадений нет". Подскажите, в чем моя ошибка?

А не проще прогнать весь файл через preg_match (10 Мбайт меньше чем за секунду прогонит) например вот так:
PHP:
скопировать код в буфер обмена
  1. $f = file_get_contents('base.csv');
  2. $ar = [];
  3. $pr = false;
  4. if(preg_match("#([^;])*;([^;])*;([^;])*;([^;])*;([^;])*;([^;])*;([^;])*;([^;])*;#", $f, $re)) {
  5.         for($i = 0; $i < count($re[0]); $i++) {
  6.                 $date = $re[1][$i];
  7.                 $time = $re[2][$i];
  8.                 $name = $re[3][$i];
  9.                 $fam = $re[4][$i];
  10.                 $lang = $re[5][$i];
  11.                 $ip = $re[6][$i];
  12.                 $par1 = $re[8][$i];
  13.                 $par2 = $re[9][$i];
  14.                 if(isset($ar[$ip])) {
  15.                         $ar[$ip]++;
  16.                         $pr = true;
  17.                         echo '<br>Найдено совпадение: '.$ip;
  18.                 }else{
  19.                         $ar[$ip]=1;
  20.                 }
  21.         }
  22.         if(!$pr) {
  23.                 echo 'Совпадений не найдено';
  24.         }
  25. }else{
  26.         throw new \LogicException('preg_match_all error');
  27. }
Prizma Отправлено: 25 Февраля, 2016 - 09:31:28 • Тема: Форма с неопределённым количеством элементов и её обработка • Форум: Вопросы новичков

Ответов: 3
Просмотров: 200
alexf пишет:
Запарился с тем, как сделать такие флажки для N слушателей (каждый флажок же должен иметь уникальный идентификатор) и как далее обработать эти флажки для фиксации посещения в базе.

очень просто, передавайте данные массивом:
CODE (html):
скопировать код в буфер обмена
  1. <input type="checkbox" name="id[1]">
  2. <input type="checkbox" name="id[3]">
  3. <input type="checkbox" name="id[8]">

И потом в $_POST будет массив:
Prizma Отправлено: 25 Февраля, 2016 - 09:23:31 • Тема: Хранение баланса пользователей • Форум: Вопросы новичков

Ответов: 2
Просмотров: 308
Добрый день,
(сайт пока находится в проектировке)
сайт связан с платежной системой, пользователь обладает своим балансом и может распоряжаться средствами на покупку услуг, товаров на сайте.
Все операции через транзакции, база MySQL.

Как правильно было бы хранить баланс пользователя в общей таблице users?
Или как то иначе? (например вообще не хранить баланс, а хранить только транзакции и рассчитывать баланс исходя из транзакций проведенных этим пользователем, каждая транзакция содержит остаток на счете, а при расчете баланса проверять информацию по 5 последним транзакциям, и в случае любой несостыковки блокировать кошелек)

Реальные деньги подстегивают еще раз подумать о безопасности))
Prizma Отправлено: 31 Января, 2016 - 07:05:20 • Тема: подсчет рефералов • Форум: Вопросы новичков

Ответов: 10
Просмотров: 536
Рачей пишет:
Да вот это хорошее решение. Спасибо. Думаю не только мне пригодится. Кстати гугл не охотно показывает что-либо по этой теме.

Когда же мне можно будет нажать кнопку спасибо? Пофлудить чтоль пойти по форуму?))

Да фигня всё это, пару лет назад - мне тоже помогали тут, считай возвращаю должок))
Prizma Отправлено: 30 Января, 2016 - 20:33:58 • Тема: include файлов с другого своего сайта. Как настроить? • Форум: Вопросы новичков

Ответов: 3
Просмотров: 341
Viper пишет:
Prizma "ох уж эти сказочники". Насоветовали и всё неправильно
я про эту опцию не знаю) я всего лишь сказал, где найти php.ini
Prizma Отправлено: 30 Января, 2016 - 20:32:17 • Тема: Как собрать массив? • Форум: Вопросы новичков

Ответов: 5
Просмотров: 162
Nesquik пишет:
$a[] .= $key . ':' . $value;
Nesquik пишет:
надо что-то вроде $a[] .= $key => $value; чтобы сделать его ассоциативным. помогите нубу.

вот это вы наверно хотите сделать:
PHP:
скопировать код в буфер обмена
  1. $a[$key] = $value;
  2. echo $a[$key]; // выведет значение $value
Prizma Отправлено: 30 Января, 2016 - 20:26:36 • Тема: include файлов с другого своего сайта. Как настроить? • Форум: Вопросы новичков

Ответов: 3
Просмотров: 341
ppokorp пишет:
Вот только непонятно, где это делать?

в папке сервера сделайте поиск "php.ini" в этой файле поиск найдете ваш флаг и установите нужное значение.
Если у вас openserver тогда конфигурационный файл находится в папке userdata далее выбираете ту версию php которую используете и редактируете требуемый файл.

Далее перезапускаете сервер и вуаля.

А так можно сделать через eval() и file_get_contents():
PHP:
скопировать код в буфер обмена
  1. if($r = file_get_contents('http://example.ru/my.php')) {
  2.    eval($r);
  3. }else{
  4.    die('не удалось загрузить ресурс');
  5. }


Так же обязательно на том сервере с которого будете грузить файл он не должен исполняться, если он имеет расширение php то можно это настроить в .htaccess, или просто поменять расширение.


Сам никогда этого не делал в принципе это не очень безопасно. Лучше подгружать результат работы скрипта, а не сам код. Делая сам код публичным вы создаете уязвимость для своего ресурса.

Страниц (31): В начало « ... 3 4 5 6 [7] 8 9 10 11 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB