Running with Ruby

Tag: file

Prosta (bardzo) księga gości w PHP

Przyszło mi dzisiaj napisać możliwie najprostszą możliwą księgę gości w PHP. Stwierdziłem, że się z wami podzielę :) Miała nie korzystać z bazy danych i nie mieć walidacji :) także jest naprawdę prosta. Na dodatek całość zawiera się aż w jednym pliku.

Najpierw zdefiniujemy sobie stałą, w której będziemy trzymać nazwę pliku przechowującego wpisy:

define("DB_FILE_NAME", 'baza.dat');

Następnie stworzymy metodę, która sprawdzi czy plik DB_FILE_NAME istnieje, a jeśli nie – to go utworzy:

function gb_init(){
  // sprawdzamy czy plik istnieje
  if (!file_exists(DB_FILE_NAME)){
    // jesli nie, to go tworzymy
    $f = fopen(DB_FILE_NAME, 'w');
    fclose($f);
  }
}

Następnie utworzymy metodę która będzie dodawać nam wpisy. Jeśli ktoś nie będzie miał nicka, to jako nick wpisze “Gość”:

function add_entry($nick, $tresc){
  $nick = HTMLSpecialChars($nick);
  $tresc = HTMLSpecialChars($tresc);
  if($nick=="")  $nick =  "Gość";
  $date = date("j.m.Y G:i");
  $text = ereg_replace("\n", "<br />", $tresc);
  $wynik = '<b>'. $nick . '</b>'. "     " . $date . '|||' .$text.  "\n";

  $fp = fopen(DB_FILE_NAME, "a");
  
  fwrite ($fp, $wynik);
  fclose($fp);
}

Następnie całość inicjujemy (przed htmlem – ponieważ to jest obsługa dodawania wpisów, a nie ich wyświetlania):

  gb_init();
  if ($_POST['nick'] && $_POST['tresc']){
    add_entry($_POST['nick'], $_POST['tresc']);
  }

Teraz pozostaje nam wyświetlić pliki:

$myFile = fopen(DB_FILE_NAME, "r");
$i = -1;
while (!feof($myFile)) {
  $myLine = fgets($myFile, 2000);
  $i++;
}
fclose($myFile);

echo "Ilość wpisów w Księdze: $i<br /><br />";
// ładujemy pliki w odwrotnej kolejnosci
$file = array_reverse(file('baza.dat'));
// I wyświetlamy rozdzielajac dane - seperator to |||
foreach ($file as $key => $value) {
  list($imie, $tresc) = explode("|||", $value);
  echo $imie . '<br />';
  echo $tresc . '<br /><br />';
  echo '<hr>';
}

Pozostaje nam jeszcze tylko formularz dodawania wpisów:

<form method="post" action="ksiega.php?id=zapisz">
<div>
   Imię: <input type="text" name="nick" /><br />
   Treść:<br />
    <textarea cols="35" name="tresc" rows="12"></textarea>  <br />
   <input type="submit" value="Wyślij"/>
</div>
</form>

Rails3, Apache + Passenger (mod Rails), send_file i pusty plik

Zauważyłem ostatnio, że send_file w Rails3 nie działa tak jak trzeba na serwerze Apache. Problem był taki, że Railsy które miały serwować plik 5MB, serwowały pusty plik.

Działo się tak tylko w środowisku produkcyjnym, więc dość ciężko było znaleźć przyczynę. Na co dzień developerkę robię na Mongrelu, pod którym wszystko działało normalnie.

Na szczęście rozwiązanie tego problemu okazało się bardzo proste. Nie na każdym serwerze można wysyłać pliki, oddelegowując je przez X-Sendfile. Wygląda na to że Rails “puszczał” nagłówek w stronę serwera, a ten po prostu go przekazywał.

Aby rozwiązać ten problem, wystarczy w pliku config/production.rb odznaczyć (zakomentować) następującą linijkę:

config.action_dispatch.x_sendfile_header = "X-Sendfile"

Po zakomentowaniu tego, Railsy będą wysyłały pliki w standardowy sposób.

Copyright © 2018 Running with Ruby

Theme by Anders NorenUp ↑