Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl


daro0
Napisane: 20.02.2018, 19:14:04





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

Do LaTeX-a masz coś tutaj:

PHP:
http://phplatex.scarfboy.com/
https://github.com/xemlock/php-latex

java script:
http://manuels.github.io/texlive.js/
https://khan.github.io/KaTeX/

  Forum: Pytania · Podgląd postu: #1229488 · Odpowiedzi: 6 · Wyświetleń: 8 786

daro0
Napisane: 18.12.2017, 10:14:48





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

Klient się często na tym nie zna, więc go nawet nie interesuje jaka jest jakość Twojego kodu. Dla niego ma działać a Ty masz wykonać to zlecenie w określonym w umowie czasie. A potem np. rozbudowywać albo dalej to utrzymywać itd. A skoro mowa o dobrej jakości kodu. O ile to nie jest przerost formy nad treścią, bierzesz takiego Symfony i opierasz na tym frameworku cały swój projekt, co do funkcjonalności po stronie przeglądarki i JavaScript, zależy od tego co ma być zrobione bo dużo może się dziać właśnie po stronie przeglądarki, bierzesz poza jQuery np. takiego Angulara albo VUE czy tam inne tego typu rzeczy i jedziesz. To żeby było wiele rzeczy wykonać łatwiej i szybciej. W dokumentacji Angulara albo VUE masz tam wypisane jakie przeglądarki są obsługiwane.

Co do płatności, często jak się robi takie zlecenia to może być opcja integracji z takim Przelewy24, PayU, Paypal czy innymi takimi serwisami. Można i bez tego to obawiam się że po każdej zaksięgowanej operacji w banku to żeby ustawić status opłacone to administrator serwisu albo inny pracownik musiałby wszystko kontrolować ręcznie w adminie, no bo jak niby masz zamiar to sprawdzać. Takie serwisy jak P24 to wysyłają POST-em twój serwis informacje o statusie, wszystko masz w dokumentacji i na tym bazujesz.

Wiedzę masz bardzo mocno rozproszoną po sieci, wiele rzeczy znajdziesz, w przypadku Symfony, Angulara czy innych tego typu rzeczy masz dokumentację, czasami coś tam da się znaleźć w jakichś przykładowych realizacjach, coś tam można popytać na forach. Książki mogą być przestarzałe. Określ dobrze co ma być zrobione z klientem i warunki w umowie, w tym w przypadku niepowodzenia projektu (jeśli początkujesz jest spore ryzyko, zależy jeszcze od złożoności projektu) i nie odbieraj tego co napisałem wcześniej jak jakiś atak, to było raczej ostrzeżenie.

Sam realizuję tego typu rzeczy samodzielnie, pracowałem już z P24, Facebookiem, Google i z ich API choć w Symfony czy tam Angularze to akurat nie działam.
  Forum: Kontrola i zarządzanie projektami · Podgląd postu: #1226528 · Odpowiedzi: 12 · Wyświetleń: 2 881

daro0
Napisane: 3.08.2017, 20:14:17





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

O ile w ogóle coś się zalogowało (wyłączone sprawdzanie błędów?). Wystarczy że zmieniła się wersja PHP z 5.4 - 5.6 na PHP 7 a CI w tej wersji która tam jest tego nie obsługuje i już może być to przyczyną problemu.
  Forum: Gotowe rozwiązania · Podgląd postu: #1219994 · Odpowiedzi: 6 · Wyświetleń: 2 337

daro0
Napisane: 5.03.2017, 10:25:47





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

Postaram się tutaj przedstawić to jakoś w miarę klarownie, bo na podstawie wielu postów na różnych forach widać jak na dłoni, że jak się ktoś czegoś uczy to jeszcze w starym stylu i pewnie też z jakichś beznadziejnych i niepraktycznych tutoriali PHP które są jeszcze w internecie.

Po pierwsze, podział kodu i podział odpowiedzialności, dla uproszczenia zakładam że wszystkie pliki PHP są w jednym katalogu projektu, lecę więc po kolei, od helperów, przez szablony aż po inne pliki. Uwaga, zakładam że liczą się duże i małe litery w nazwach plików z klasami.

Klasa View.php odpowiedzialna za renderowanie szablonów:

  1. <?php
  2.  
  3. defined('DOCROOT') OR die('No direct script access.');
  4.  
  5. class View
  6. {
  7. private $_file;
  8. private $_data;
  9.  
  10. public static function factory($file, array $data)
  11. {
  12. return new View($file, $data);
  13. }
  14.  
  15. public function __construct($file, array $data)
  16. {
  17. $this->_file = DOCROOT . $file . '.php';
  18. $this->_data = $data;
  19. }
  20.  
  21. public function render()
  22. {
  23. extract($this->_data);
  24. include $this->_file;
  25. return ob_get_clean();
  26. }
  27.  
  28. public function __toString()
  29. {
  30. return $this->render();
  31. }
  32.  
  33. }


Klasa Auth.php odpowiedzialna za logowanie i sprawdzanie czy użytkownik jest zalogowany:

  1. <?php
  2.  
  3. defined('DOCROOT') OR die('No direct script access.');
  4.  
  5. class Auth
  6. {
  7. private $_config;
  8. private $_db;
  9. private $_session_key;
  10.  
  11. public function __construct($config)
  12. {
  13. $this->_config = $config;
  14. $dsn = 'mysql:host=' . $config['database']['host'] . '; port='.$config['database']['port'].'; dbname=' . $config['database']['database'];
  15. $this->_db = $pdo = new PDO($dsn, $config['database']['username'], $config['database']['password']);
  16. $this->_session_key = $config['auth']['session_key'];
  17. }
  18.  
  19. public function get_user()
  20. {
  21. $now = time();
  22. $max_idle_time = $this->_config['auth']['max_idle_time'];
  23.  
  24. if (array_key_exists($this->_session_key, $_SESSION))
  25. {
  26. if (($now - $_SESSION[$this->_session_key]['last_active'] < $max_idle_time))
  27. {
  28. return $_SESSION[$this->_session_key]['user'];
  29. }
  30. return NULL;
  31. }
  32.  
  33. return NULL;
  34. }
  35.  
  36. public function logged_in()
  37. {
  38. return ($this->get_user() !== NULL);
  39. }
  40.  
  41. public function login($username, $password)
  42. {
  43. $password = hash_hmac('sha256', $password, $this->_config['auth']['hash_key']);
  44. $stmt = $this->_db->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
  45. $stmt->execute(array(':username' => $username, ':password' => $password));
  46.  
  47. if ($row = $stmt->fetch(PDO::FETCH_ASSOC))
  48. {
  49. $_SESSION[$this->_session_key] = array(
  50. 'user' => $row,
  51. 'last_active' => time(),
  52. );
  53.  
  54. return true;
  55. }
  56. return false;
  57. }
  58. }


plik config.php z danymi do połączenia z bazą i danymi do obsługi logowania:

  1. <?php
  2.  
  3. return array(
  4. 'database' => array(
  5. 'host' => 'localhost',
  6. 'port' => 3306,
  7. 'database' => 'testdb',
  8. 'username' => 'root',
  9. 'password' => 'root',
  10. ),
  11. 'auth' => array(
  12. 'session_key' => 'auth_user',
  13. 'hash_key' => '213dsklsdks32000',
  14. 'max_idle_time' => 60,
  15. ),
  16. );


główny layout, plik layout.php

  1. <html lang="pl">
  2. <head>
  3. <meta charset="utf-8" />
  4. </head>
  5. <body>
  6. <?php if (isset($content)) echo $content; ?>
  7. </body>
  8. </html>


szablon logowania login.php

  1. <?php if ($user): ?>
  2. <H1><?= 'Jesteś zalogowany(a) jako: ' . $user['username'] ?></H1>
  3. <script>
  4. function reloadAsGet()
  5. {
  6. var loc = window.location;
  7. window.location = loc.protocol + '//' + loc.host + loc.pathname + loc.search;
  8. }
  9.  
  10. setTimeout(function(){
  11. reloadAsGet();
  12. }, <?= $reload_timeout * 1000 ?>);
  13. </script>
  14. <?php else: ?>
  15. <h1>Logowanie</h1>
  16. <form action="" method="POST">
  17. <div>
  18. <input type="text" name="username" value="">
  19. </div>
  20. <div>
  21. <input type="password" name="password" value="">
  22. </div>
  23. <button type="submit">Zaloguj</button>
  24. </form>
  25. <?php endif; ?>
  26. <h3 id="message"><?= $message ?></h3>


no i ostatecznie index.php

  1. <?php
  2. define('DOCROOT', realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR);
  3.  
  4. spl_autoload_extensions('.php');
  5. spl_autoload_register();
  6.  
  7. $config = include 'config.php';
  8. $auth = new Auth($config);
  9. $message = '';
  10. $reload_timeout = $config['auth']['max_idle_time'];
  11.  
  12. if ($_SERVER['REQUEST_METHOD'] === 'POST')
  13. {
  14. $result = $auth->login($_POST['username'], $_POST['password']);
  15. if (!$result)
  16. {
  17. $message = 'Błąd logowania';
  18. }
  19. }
  20.  
  21. $user = $auth->get_user();
  22.  
  23. $content = View::factory('login', compact('user', 'message', 'reload_timeout'));
  24. $layout = View::factory('layout', compact('content'));
  25.  
  26. echo $layout;


Co też testowałem na jednej ze swoich baz MySQL na localhoście, nie wiem tylko czy ta funkcja reloadAsGet zadziała na wszystkich przeglądarkach. W tym przykładzie po ustawionym czasie bezczynności 1 minuty po zalogowaniu nastąpi po tym czasie przeładowanie strony nie jako POST ale GET ze sprawdzeniem czy użytkownik jest zalogowany, jeśli nie to się wyświetli ten formularz.

Po drugie. Jest chyba dość cienka granica między bezpieczeństwem a paranoją. Tu zakładam że w każdym innym projekcie są różne te hash_key i zakładam że jest SHA256 i 64 znaków w polach z hasłem. Ten automatyczny reload to w pewnych przypadkach może pewnie nawet przeszkadzać niż pomagać, w szczególności może denerwować.

I nie jakieś przypisywanie bezpośrednio do sesji a tutaj użyty jest klucz auth_user związany z tą właśnie obsługą logowania a ze względów praktycznych do tejże sesji zapisywany jest cały wiersz z bazy danych a nie tylko niektóre pola, nie muszę chyba tłumaczyć dlaczego.
  Forum: PHP · Podgląd postu: #1211927 · Odpowiedzi: 5 · Wyświetleń: 797

daro0
Napisane: 7.02.2017, 16:08:15





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

A to?

  1. $subject = '[ ( "key" , "val" ), ("key2","[]{}()val2" ), ("key3","val3")]';
  2.  
  3. $patterns = array(
  4. '/\([\s]*"/',
  5. '/"[\s]*\)/',
  6. '/"[\s]*,/',
  7. );
  8. $replace = array(
  9. '{"',
  10. '"}',
  11. '":',
  12. );
  13.  
  14. $json = preg_replace($patterns, $replace, $subject);
  15. var_dump($subject, $json, json_decode($json));


wynik:

  1. string(69) "[ ( "key" , "val" ), ("key2","[]{}()val2" ), ("key3","val3")]"
  2. string(58) "[ {"key": "val"}, {"key2":"[]{}()val2"}, {"key3":"val3"}]"
  3. array(3) {
  4. [0]=>
  5. object(stdClass)#1 (1) {
  6. ["key"]=>
  7. string(3) "val"
  8. }
  9. [1]=>
  10. object(stdClass)#2 (1) {
  11. ["key2"]=>
  12. string(10) "[]{}()val2"
  13. }
  14. [2]=>
  15. object(stdClass)#3 (1) {
  16. ["key3"]=>
  17. string(4) "val3"
  18. }
  19. }
  20.  
  Forum: Przedszkole · Podgląd postu: #1210441 · Odpowiedzi: 8 · Wyświetleń: 486

daro0
Napisane: 21.09.2016, 09:20:32





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

No rozpacz sad.gif

  1. <?php
  2. $now = time();
  3. $session_key = 'auth_user';
  4.  
  5. if ($_SERVER['REQUEST_METHOD'] == 'POST')
  6. {
  7. $host = 'localhost';
  8. $dbname = 'mojabaza';
  9. $user = 'root';
  10. $passwd = 'root';
  11.  
  12. $dsn = 'mysql:host='. $host . '; dbname=' . $dbname;
  13. $pdo = new PDO($dsn, $user, $passwd);
  14.  
  15. //akurat taka sól jest użyta w celu hashowania hasła w mojej testowej bazie
  16. $salt = 'gj5PxmUt8CAbcnS2';
  17. $login = $_POST['login'];
  18. //test na PHP 5.4 (tam nie ma password_hash :-) )
  19. $password = hash_hmac('sha256', $_POST['password'], $salt);
  20.  
  21. //akurat takie pola mam w bazie czyli username i password jako SHA-256
  22. $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
  23. $stmt->execute(array(':username' => $login, ':password' => $password));
  24.  
  25. if ($row = $stmt->fetch(PDO::FETCH_ASSOC))
  26. {
  27. $session_data = array(
  28. 'time' => $now,
  29. 'user' => $row
  30. );
  31.  
  32. $_SESSION[$session_key] = $session_data;
  33. }
  34. else
  35. {
  36. echo "Blad logowania";
  37. }
  38. }
  39.  
  40. $max_idle_time = 30;
  41. // czy nie wystarczy tylko sprawdzanie po tym questionmark.gifquestionmark.gifquestionmark.gif
  42. if (isset($_SESSION[$session_key]) && !empty($_SESSION[$session_key]))
  43. {
  44. if ($now - $_SESSION[$session_key]['time'] < $max_idle_time)
  45. {
  46. $_SESSION[$session_key]['time'] = $now;
  47. echo "Jestes zalogowany";
  48. }
  49. else
  50. {
  51. echo "Przekroczono czas bezczynnosci";
  52. }
  53. }
  54. else
  55. {
  56. echo '<h1>Panel Uzytkownika</h1>
  57. <form method="post" action="">
  58. <div>
  59. <input type="text" name="login" placeholder="Twoj login" value="">
  60. </div>
  61. <div>
  62. <input type="password" name="password" placeholder="Twoje haslo" value="">
  63. </div>
  64. <button type="submit">Zaloguj sie</button>
  65. </form>';
  66. }
  67. ?>


Testowałem to na jednej ze swoich baz na localhoście, Ty musisz dostosować (pola), jak i hasła (sposób hashowania) do swojej.
  Forum: PHP · Podgląd postu: #1200528 · Odpowiedzi: 17 · Wyświetleń: 1 238

daro0
Napisane: 13.09.2016, 18:42:50





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

Na szybko to tu są przykłady:
http://www.w3schools.com/php/php_mysql_select.asp
  Forum: Przedszkole · Podgląd postu: #1199949 · Odpowiedzi: 9 · Wyświetleń: 407

daro0
Napisane: 31.08.2016, 19:54:19





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

To masz do wyboru: albo zainteresujesz się na poważnie Wordpressem i przeróżnymi wtyczkami do niego, albo jakimś frameworkiem, bo jeśli zamierzasz to robić od zera, to oprócz SQL Injection dojdą jeszcze ataki typu XSS, CSRF, Session Fixation, Session Poisoning, Session Hijacking itd. Więc do prostego CRUD-a musisz mieć w tym przypadku większą wiedzę frameworki już implementują ochronę przed SQL Injection, XSS albo CSRF. Dalej dochodzą jeszcze sprawy związane z zastosowaniem cache na tych newsach, które będą się wyświetlać, bo jak coś się nie zmienia albo zmienia się rzadko, to się stosuje takie zabiegi. Tu chodzi o przyspieszenie działania. Jest jeszcze wiele innych rzeczy które musisz ogarnąć.
  Forum: Systemy portalowe i CMS'y · Podgląd postu: #1199105 · Odpowiedzi: 12 · Wyświetleń: 3 133

daro0
Napisane: 25.07.2016, 19:07:02





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

A np. tak:

  1. $source='<li><a href="link1.html"> Link 1</a></li>';
  2. preg_match("'<li><a href=\"link1.html\">(.*?)<\/a><\/li>'si", $source, $match);
  3. if($match) echo $match[1];


i po kolei musisz jechać z kolejnymi linkami wstawiając to jako pattern czyli

  1. $source='<li><a href="link2.html"> Link 2</a></li>';
  2. preg_match("'<li><a href=\"link2.html\">(.*?)<\/a><\/li>'si", $source, $match);
  3. if($match) echo $match[1];


  1. $source='<li><a href="link3.html"> Link 3</a></li>';
  2. preg_match("'<li><a href=\"link3.html\">(.*?)<\/a><\/li>'si", $source, $match);
  3. if($match) echo $match[1];


itd.

http://stackoverflow.com/questions/1586779...tween-html-tags

to też działa:
  1. $source='<li><a href="link3.html"> Link 3</a></li>';
  2. preg_match('/<li><a href="link3.html">(.*?)<\/a><\/li>/si', $source, $match);
  3. if($match) echo $match[1];
  Forum: Przedszkole · Podgląd postu: #1196763 · Odpowiedzi: 4 · Wyświetleń: 256

daro0
Napisane: 31.07.2016, 16:07:12





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

Zakładam że utworzysz sobie tabelę user_groups z polami: id (int11 unsigned, PK, autoincrement ), user_id (int11 unsigned), group_id (int11 unsigned) oraz active (tinyint(1)) i masz:

APPPATH/classes/Model/User/Group.php a w nim tak:

  1. class Model_User_Group extends ORM
  2. {
  3. protected $_table_name = 'user_groups';
  4.  
  5. protected $_belongs_to = array(
  6. 'user' => array('model' => 'User', 'foreign_key' => 'user_id'),
  7. 'group' => array('model' => 'Group', 'foreign_key' => 'group_id'),
  8. );
  9.  
  10. }


i przy dodawaniu (załóżmy że dodajesz siebie jako zalogowanego użytkownika tzn. wyrażasz chęć dołączenia):

  1. $user = Auth::instance()->get_user();
  2. $group = ORM::factory('Group', $jakies_id_grupy);
  3.  
  4. $user_group = ORM::factory('User_Group');
  5. $user_group->user_id = $user->id;
  6. $user_group->group_id = $group->id;
  7. $user_group->active = false;
  8. $user_group->save();


a potem tylko w prosty sposób jakiś admin może to aktywować:

  1. $user_group = ORM::factory('User_Group')
  2. ->where('user_id', '=', $jakies_id_uzytkownika)
  3. ->where('group_id', '=', $id_tej_grupy)
  4. ->find();
  5. IF ($user_group->loaded())
  6. {
  7. $user_group->active = true;
  8. $user_group->save();
  9. }
  10. else
  11. {
  12. // jakies instrukcje powiadamiajace ze nie ma takiego uzytkownika w grupie
  13. }
  Forum: Frameworki · Podgląd postu: #1197165 · Odpowiedzi: 3 · Wyświetleń: 411

daro0
Napisane: 21.07.2016, 18:04:15





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

Można też inaczej:

  1. try
  2. {
  3. $user = ORM::factory('User')->create_user($this->request->post(), array(
  4. 'username',
  5. 'password',
  6. 'email'
  7. ));
  8.  
  9. $user->add('roles', ORM::factory('Role', array('name' => 'login')));
  10.  
  11. } catch (ORM_Validation_Exception $e)
  12. {
  13. $errors = $e->errors('models');
  14. }
  15.  


Ważne, w widoku odpowiedzialnym za rejestrację użytkownika muszą być pola tekstowe formularza o nazwach (atrybuty name): username, email, password, oraz password_confirm, więc potrzeba tam te cztery pola, nazwa użytkownika, email (musi być unikatowy), hasło (min. 8 znaków) oraz powtórz hasło, żeby się zgadzały i sądzę że stąd ten błąd.

Natomiast w tym catch odpowiada to za pobieranie informacji o błędach walidacji,

w katalogu /application/messages/models powinien być:

user.php

  1. <?php
  2.  
  3. return array(
  4. 'username' => array(
  5. 'not_empty' => 'Musisz wprowadzić nazwę użytkownika.',
  6. 'min_length' => 'Minimum :param2 znaków.',
  7. 'max_length' => 'Dopuszczalne :param2 znaków.',
  8. 'username_available' => 'Ta nazwa już istnieje.',
  9. 'unique' => 'Użytkownik o takiej nazwie już istnieje w bazie.'
  10. ),
  11. 'email' => array(
  12. 'not_empty' => 'Musisz wprowadzić adres e-mail',
  13. 'min_length' => 'Minimum :param2 znaków.',
  14. 'max_length' => 'Dopuszczalne :param2 znaków.',
  15. 'email' => 'Wprowadź prawidłowy adres',
  16. 'email_available' => 'Ten mail jest już w bazie.',
  17. 'unique' => 'Ten adres e-mail już istnieje w bazie.'
  18. )
  19. );
  20.  


w /application/messages/models/user powinien być:

_external.php

  1. <?php
  2.  
  3. return array(
  4. 'password_confirm' => array(
  5. 'matches' => 'Hasła się nie zgadzają.',
  6. ),
  7. 'password' => array(
  8. 'not_empty' => 'Proszę wprowadzić hasło.',
  9. 'min_length' => 'Hasło musi mieć min. :param2 znaków',
  10. )
  11. );


a to przykładowy fragment widoku do rejestracji:

  1. <input type="text" name="username">
  2. <span class="errormsg"><?php if (isset($errors['username'])) echo $errors['username']; ?></span>
  3. <input type="text" name="email">
  4. <span class="errormsg"><?php if (isset($errors['email'])) echo $errors['email']; ?></span>
  5. <input type="password" name="password">
  6. <span class="errormsg"><?php if (isset($errors['_external']['password'])) echo $errors['_external']['password'];; ?></span>
  7. <input type="password" name="password_confirm">
  8. <span class="errormsg"><?php if (isset($errors['_external']['password_confirm'])) echo $errors['_external']['password_confirm']; ?></span>
  9.  


Schema bazy danych (MySQL) jest tam w module ORM, zakładam że z tego korzystasz.

Napisz czy to zadziała bo sam robiłem już niejedną aplikację w Kohanie (3.2/3.3)
  Forum: Frameworki · Podgląd postu: #1196557 · Odpowiedzi: 3 · Wyświetleń: 651

daro0
Napisane: 4.07.2016, 16:30:54





Grupa: Zarejestrowani
Postów: 88
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----

@rebuk Ale optymalizacje to się robi jak jest co optymalizować a bez takich narzędzi jak profiler to sobie można. Każdy liczący się FW ma takie narzędzia, jeśli takiego nie masz to jedyne co możesz zrobić to dawać znaczniki czasu przed i po, przy użyciu funkcji microtime, to Ci da pewien obraz co i ile się wykonuje. Nie wiem czy używasz MySQL ale z tego co tu pisze to już sam silnik ma coś takiego:

http://dev.mysql.com/doc/refman/5.7/en/query-cache.html

Poza tym w jakiej postaci masz to zrealizowane? Serializujesz dane i zapisujesz cokolwiek na czym robisz cache do jednego tylko katalogu? Frameworki mają w File Store nazwy plików cache jako SHA1 albo md5 z tego co się zapisuje (po nazwach kluczowych), do tego jeszcze tworzone są podkatalogi o nazwach z dwóch pierwszych znaków z tych nazw plików czyli 00..ff, masz więc pliki cache rozmieszczone w 256 podkatalogach, o ile będą utworzone. Laravel dzieli jeszcze te podkatalogi na kolejne podkatalogi z 2 kolejnych znaków z nazw plików, więc zapisuje cache np tak:

app/storage/cache/a1/91/a1918afa3f5dd7f8369287c0f18ad874

i jak widzisz masz podkatalogi a1 a potem 91 które są od nazwy pliku tego cache które jest tak naprawdę md5 z klucza.

Dodatkowo na file store robi się garbage collector, więc wygasłe cache usuwa się probabilistycznie przy użyciu mt_rand albo rand, więc usuwane są wygasłe już pliki cache a podkatalogi raczej zostawiane, tak żeby zwolnić miejsce na dysku.

Ale oczywiście masz rację, bo robiłem cache np. na generowaniu danych do PDF, tutaj nie ma sensu czegoś takiego robić za każdym razem na tych samych danych, tak samo jak używałem cache przy pobieraniu nie zmieniających się danych z zewnętrznych JSON-owych API ale to też dobrze widać jak to działa i ile się da ugrać przy użyciu profilera. No ale jak dane zmieniają się zbyt często to zastanawiam się gdzie tu jest sens?
  Forum: PHP · Podgląd postu: #1195430 · Odpowiedzi: 11 · Wyświetleń: 1 202


New Posts  Nowe odpowiedzi
No New Posts  Brak nowych odpowiedzi
Hot topic  Popularny temat (Nowe)
No new  Popularny temat (Brak nowych)
Poll  Sonda (Nowe)
No new votes  Sonda (Brak nowych)
Closed  Zamknięty temat
Moved  Przeniesiony temat
 

RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 11:49