TinyURL. Шаг за шагом. Шаг 1

Этим постом я открываю на блоге новую рубрику "PHP Шаг за шагом", в которой буду рассказывать о разработке небольших, но полезных скриптов и сервисов. Смею надеяться, что мне есть чем поделиться с читателями блога и, конечно же, есть то, чему я могу поучиться у вас.

Первый скрипт, о котором пойдет речь - это сервис сокращенных ссылок - TinyURL Думаю, что пояснять суть сервиса нет неоходимости, а вот назначение, каждый придумает сам в меру своей испорченности.

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

Для этого я реализую новую функцию fwritelock, которая защищает файл от одновременной правки разными пользователями, а функцию сохранения массива в файл заменю функцией конвертации php массива в строку.

Подробных, пояснений давать не стану, но если возникнут вопросы, то непременно отвечу. Только прошу учесть, что на блоге пока нет нотификации о новых комментариях.

  1.  
  2. function arraytostr($array, $level = 0)
  3. {
  4. $str = '';
  5. if($level == 0)
  6. {
  7. $str .= "\n\$_array = ";
  8. }
  9. $level++;
  10.  
  11. $cnt = count($array);
  12. $i = 0;
  13. $space = str_repeat(' ', $level * 2);
  14. $str .= "\n{$space}array\n{$space}(\n";
  15.  
  16. foreach($array as $key => $value)
  17. {
  18. if($i++ != 0)
  19. {
  20. $str .= ",\n";
  21. }
  22. $str .= "$space ";
  23. if(is_array($array[$key]))
  24. {
  25. $str .= "'$key' => ";
  26. $str .= arraytostr($array[$key], $level);
  27. }
  28. else
  29. {
  30. $value = addcslashes($value, "'"."\\\\");
  31. $str .= "'$key' => '$value'";
  32. }
  33. }
  34. $str .= "\n{$space})";
  35.  
  36. $level--;
  37. if($level == 0)
  38. {
  39. $str .= ";\n";
  40. }
  41. return $str;
  42. }
  43.  
  44. function arraytofile($array, $filename = "array.php")
  45. {
  46. fwritelock($filename, '<' . '?' . arraytostr($array) . '?' . '>');
  47. }
  48.  
  49. function fwritelock($filename, $data)
  50. {
  51. $f = fopen($filename, "a+");
  52. flock($f, LOCK_EX);
  53. ftruncate($f, 0);
  54. fwrite($f, $data);
  55. fflush($f);
  56. flock($f, LOCK_UN);
  57. fclose($f);
  58. }
  59.  
  60. $a = array(
  61. 0 => 'Данные удобно хранить в php массиве',
  62. 1 => array(
  63. 'str' => 'Можно использовать ассоциативные массивы',
  64. 'data' => array(
  65. 0 => 'и произвольный уровень вложенности',
  66. 1 => 1234567890,
  67. 2 => 'Это не только удобно, но и быстро!'
  68. )));
  69.  
  70. echo "<pre>";
  71. $str = arraytostr($a);
  72. echo htmlspecialchars($str);
  73. eval($str);
  74. echo "\n";
  75. print_r($_array);
  76. arraytofile($a);
  77. include("array.php");
  78. echo "\n";
  79. print_r($_array);
  80. echo "</pre>";
  81.  

В следующий раз поговорим о том, как закодировать URL, а так же о принципах хранения данных.

Читайте в блоге

PHP. Сохранение массива в файл
Использование md5 в Oracle.
Несколько слов об использовании Mercurial.
JavaScript и MFC. Интеграция Property Tree в MFC приложение.
Полезные ссылки

Комментарии:

Войдите на сайт, чтобы оставить комментарий