Internet: PHP, CGI, stb.

Nyelvi modul fejlesztése,smarty változó nevének cseréje

Sziasztok!

Elakadtam egy problémánál és nem tudom, hogyan is oldjam meg. Lehet, hogy valakinek van valami korszak alkotó ötlete amivel tovább tudna lendíteni. Szeretnék készíteni egy oldalhoz egy nyelvi modult ami egyben egy fordító is lesz. Adott egy menü és egy blokk tábla. Egyszerűsítve így kérdeztem le eddig az adatokat.

$r = $db -> query("SELECT Menu.*,MenuBlock.mb_id,MenuBlock.mb_name,MenuBlock.position,MenuBlock.enable,MenuBlock.registered,MenuBlock.senddate FROM Menu
while ($x = $db -> fetch_assoc($r)) $a[] = $x;

Majd smarty-val egy foreach-el kiirattam. Pl a menü nevét így
ul
{foreach from=$leftmenu item=menu}
li class="category-top_un {if $menu_id == $menu.menu_id}active{/if}"
a class="category-top_un" target='{$menu.target}' href="{if $menu.menu_type == 'Weblinks'}{$menu.menu_url}{else}{$menu.menu_url}&menu_id={$menu.menu_id}{/if}"{$menu.menu_title}/a/li
{/foreach}
/ul

A gond, hogy ugye bejönnek a nyelvek. Az alapértelmezett nyelv mondjuk a magyar. $getLang = 'hu'
Egy úgy oldottam meg, hogy a tábla mező nevét változattam meg így. menu_title => menu_title_hu
Ha angol akkor pedig menu_title_en. Így a nyelvnek megfelő rekordot olvasom ki az adatbázisból. Viszont ebben az esetben a smarty-ban ez a forma nem lesz jó.
{$men.menu_title} Helyette ez kellene: {$menu.menu_title_hu} vagy {$menu.menu_title_en} A nyelvnek megfelelően. Ez a problémát hogyan lehet megoldani? Remélem érthetően írtam le.

apache fcgid modul probléma

Sziasztok!

Adott egy ős régi Fedora Core 5 rendszer, azon szeretnék egy egyszerű fastcgi binárist futtatni (java-ban van írva és gcj-vel natívra van fordítva, a javas fastcgi osztályok a fastcgi.com-ról vannak letöltve).
Nem működik, nekem úgy tűnik, hogy az apache nem addja át azokat környezeti változókat, amikre a fastcgi programnak szüksége van.

A standard output-ra nyomtatott cucc egy az egyben az apache error_log-jában köt ki:

Content-type: text/html

sshd controller
action=null

FCGI_PORT=null

-- listing properties --
...

[Sat Sep 25 12:06:01 2010] [warn] (104)Connection reset by peer: mod_fcgid: read
data from fastcgi server error.
[Sat Sep 25 12:06:01 2010] [error] [client 172.20.8.16] Premature end of script
headers: SshdController.fcgi

A http header szerintem jó, többször ellenőriztem, és arra is figyeltem, hogy a header 2 DOS-os sorvég karakterrel legyen lezárva (0xd, 0xa). Header kiírása után flush-olom az output stream-et.

Tudomásom szerint (fcgi classok forrásának review-ja alapján) az FCGI_PORT property-nek be kellene lennie állítva.

String port = System.getProperty("FCGI_PORT");

Ez null-t ad. Vagy ezt valami wrapper script-nek kellene beállítania?

Minden segítséget előre is köszönök!

Opera, notepad++, forráskód

Sziasztok!

Volt egyszer fórumom arról hogy az egyik opera böngésző frissítés után, ha meg nézem a forráskódot (amihez az NP++ van rendelve), akkor színezés nélküli "normal text"-ként jelenítette meg.

Most megoldottam a problémát.

Aki hasonló kombinációt használ és érdekli a dolgok, annak leírom.

Szerkesztve:

A notepad++ home könyvtárában a langs.xml -be kell beillesztenünk. Mégpedig:

Eredeti:
...Language name="php" ext="php php3 phtml" ...

Javított:
...Language name="php" ext="php php3 phtml tmp" ...

Fast-cgi FD_SETSIZE


[Tue Sep 21 09:46:45 2010] [error] [client x.x.x.x] (20)Not a directory: FastCGI: failed to connect to server "/var/www/fcgi/php-fcgi": socket file descriptor (1025) is larger than FD_SETSIZE (1024), you probably need to rebuild Apache with a larger FD_SETSIZE, referer: xxxxx

Ilyenkor dob egy 500-as hibát.

Ahogy elértem az 1000 virtualhostot, előjött ez a limit.
A szerveren Apache2 és mod_fastcgi-SNAP-0910052141 van.

Kis googlezás után megcsináltam ezt:
http://cpdevel.com/projects/project.php?s=&issueid=98&filter=all

De utána meg ilyen hibák lettek, és ahogy nőtt a virtalhostok száma, úgy egyre gyakrabban:

[Sun Sep 19 08:35:10 2010] [error] [client x.x.x.x] (9)Bad file descriptor: FastCGI: comm with server "/var/www/fcgi/php-fcgi" aborted: select() failed, referer: xxxxx

Ötlet valakinek esetleg?

Webtárhely + Domain

Sziasztok,

Szeretném véleményeteket kérni olcsó webtárhellyel és domain regisztrációval (hu, eu vagy net) kapcsolatban.
Egy napi 100 fős látogatottságú oldalt szeretnék elhelyezni.
Egyéni oldal, a terhelése elmarad egy drupaltól.

Az oldal PHP és MySQL alapú.

Cron PHP végrehajtás include() Unable to access

Sziasztok!

Van egy csomó php fájlom, amit szeretnék Cronnal lefuttatni. Ezért írtam egy fájlt, és azt akarom meghívni:
crontab.sh

#!/bin/bash

php="/usr/bin/php -f"
home="/srv/www/www.xy.hu/xml"

$php $home/vmi1.php
$php $home/vmi2.php
$php $home/vmi3.php
$php $home/vmi4.php
$php $home/vmi5.php

/etc/crontab

50 1 * * * root sudo -u '#10002' /srv/www/www.xy.hu/xml/crontab.sh > /root/xml.log 2>&1;

xml mappa: 777, tulajdonos 10002
xml/crontab.sh: 755, tulajdonos 10002
includeclass.php 664, tulajdonos 10002
xml/vmi1.php 664, tulajdonos 10002

xml/vmi1.php

include('../includeclass.php');

xml.log

Warning: include(): Unable to access ../includeclass.php in /srv/www/www.xy.hu/xml/vmi1.php on line 4
PHP Warning: include(../includeclass.php): failed to open stream: No such file or directory in /srv/www/www.xy.hu/xml/vmi1.php on line 4

Ötlet?

javascript

Hi!

Van 3 input mező. Az első két mező date tipusu, a bevitel éééé-hh-nn ba engedélyezett.
A harmadik beviteli mező egy szám mező pozitív egész számokat fogad el.
Amit csinálna a script, hogy az első mezőbe lévő dátumhoz hozzáadja a harmadik mezőben lévő számot.
A script:


 f unction fiz_hat(){
  str2=document.form1.szth.value;
  str1=document.form1.szt.value;
  var year=str1.substr(0,4);
  var month=str1.substr(5,2);
  var day=str1.substr(8,2);

  if (str2>0)
  {

if ((month=="09") || (month=="04") ||(month=="06") || (month=="11"))  days=30;
if ((month=="02") && ((year=="2008") || (year=="2016") || (year=="2012") || (year=="2020"))) days=29;
if ((month=="02") && (!(year=="2008") || (year=="2016") || (year=="2012") || (year=="2020"))) days=28;
if ((month=="01") || (month=="03") || (month=="05") ||(month=="07") ||(month=="08") || (month=="10") ||(month=="12"))  days=31;

		day=parseInt(day) + parseInt(str2);
		month=parseInt(month);

  	if (day > days)
  	{
  		month=parseInt(month) + 1;
  		day= parseInt(day)-parseInt(days);
		year= parseInt(year);
		  	if (day > days)
  		{
  			month=parseInt(month) + 1;
  			day= parseInt(day)-parseInt(days);
			year= parseInt(year);
			  	if (day > days)
  			{
  				month=parseInt(month) + 1;
  				day= parseInt(day)-parseInt(days);
				year= parseInt(year);
  			}
  		}
  	}
  	if (month>12)
  	{
  		month=parseInt(month)-12;
  		year= parseInt(year)+1;
  	}
  	if (day<10) day="0"+day;
  	if (month<10) month="0"+month;
  }
document.form1.szh.value='' + year + '-' + month + '-' + day;
}

Ez eddig jól működik. Viszont a 8. és 9. hóba a month értéke 0 lesz. És nembírok rájönni a hibára.
Hol rontottam el?

pch

PHP Garbage Collector Debian alatt és általában [MEGOLDVA]

Üdv!

Röviden az alapsztori:

"...éppen most írom a szakdolgozatomat. A feladat egy olyan webes alapú rendszer készítése, amelyen keresztül hallgatókat lehet felvenni egy adatnázisba (mysql adatbázis). A rendszernek a lényege, hogy azokat a hallgatókat akik elkezdték/befejezték/leadták stb... a szakdolgozatukat tudjuk kezelni elektronikusan, illetve nyomon tudjuk követni ki hol tart, valamint statisztikát lehessen készíteni pl hány PTI-s hallgató írt szakdogát 2010 második félévében. A lényeg, hogy az egésznek az alapja php, de mivel ez egy admin felület lesz (értsd: localhoston megy és csak jelszóval lehet bármilyen funkcióját is elérni) ezért úgy érzem, hogy itt megengedhető a js..."

Most éppen ott akadtam el, hogy nem szeretném, hogy a session lejárjon egy bizonyos idő után. De mivel a php.ini-ben a session.gc_maxlifetime = 1440 ezért 24 perc elteltével minden session törlődik...
Na de én azt szeretném, hogy a saját session-öm megmaradjon, ergo míg nem kattintok a kilépésre nem lépjen ki a rendszer, bár amikor kilépek akkor törlődhet a session! A legegyszerűbb megoldás az lenne, ha a php.ini-ben a session.gc_mxlifetime-ot levenném 0-ra, de ez azért mégis csak elég "brutális" a többi domain-el szemben. Tehát valami olyan kéne, hogy csak az én session-jeimre vonatkozzon a beállítás. Itt jön a képbe ez. Amint látjuk az ini_set("session.gc_maxlifetime", 24 * 3600); parancs önmagában még nem megoldás mert a garbage collector a többi domain miatt ugyanugy lezúzza az én session-ömet is. Én az első megoldást választottam vagyis saját könyvtárba rakom a session-ömet. Na most itt jön a képbe az amit még nem mondtam, hogy Debian rendszeren fut a szerver.

Idézet a php.net fórumából: http://hu2.php.net/manual/en/function.session-save-path.php#98106

"Debian does not use the default garbage collector for sessions. Instead, it sets session.gc_probability to zero and it runs a cron job to clean up old session data in the default directory.

As a result, if your site sets a custom location with session_save_path() you also need to set a value for session.gc_probability, e.g.:

<?php
session_save_path('/home/example.com/sessions');
ini_set('session.gc_probability', 1);
?>

Otherwise, old files in '/home/example.com/sessions' will never get removed!"

Vagyis Debian alatt nem is a gc végzi a piszkos munkát hanem a crontab? Hogy is van ez akkor?

Ami eddig van:

public function setSession() {
strstr ( strtoupper ( substr ( PHP_OS, 0, 3 ) ), "WIN" ) ? $sep = "\\" : $sep = "/";
$sessDir = ini_get ( "session.save_path" ) . $sep . "my_sessions";
if (! is_dir ( $sessDir )) {
mkdir ( $sessDir, 0777 );
}
ini_set ( "session.save_path", $sessDir );
}

Szerintem ez azért nem lesz jó mert az almappákba (/var/lib/php5/my_sessions/) Ugyanúgy benéz a crontab és a gc is és letörli a session-öket. A másik, hogy van ez a setSession() függvény, minden php oldalam ugyebár a session_start() hívással kezdődik, akkor ezt minden oldal elejére be kell elé vágnom, vagy csak az index.php? Ez sem teljesen tiszta.

Összegzés:

- Szeretném, hogy soha ne léptesse ki a rendszer a userem, viszont nem szeretném, hogy egy idő után sok sok "szemét" session legyen a könyvtáramban.
- Nem szeretnék semmit se piszkálni a szerver configban. (Ha feltöltöm akármilyen szerverre a rendszerem működjön állítgatás nélkül)

Szóval ez ügyben kérném a segítségeteket.

MEGOLDÁS:

A megoldás végül az lett, hogy a session-t adatbázisban tároltam. Leírom részletesen az egészet, hátha valakinek még jó lesz (ha más nem nekem dokumentáció céljából :)) Az egészet rootkit leírása alapján csináltam (ezért köszönet neki) némi változtatással.

MySQL táblák felépítése:


mysql> desc users;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| user_id | int(11)     | NO   | PRI | NULL    | auto_increment | 
| logname | varchar(20) | YES  |     | NULL    |                | 
| logpass | varchar(32) | YES  |     | NULL    |                | 
+---------+-------------+------+-----+---------+----------------+

mysql> desc manage_session;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| sess_id   | varchar(32) | NO   | PRI | NULL    |       | 
| user_id   | int(11)     | YES  | MUL | NULL    |       | 
| lastlogin | datetime    | YES  |     | NULL    |       | 
+-----------+-------------+------+-----+---------+-------+

mysql> select * from users;
+---------+---------+----------------------------------+
| user_id | logname | logpass                          |
+---------+---------+----------------------------------+
|       2 | phppityu| 1337123456re4343szupertitkosmd5  | 
+---------+---------+----------------------------------+

mysql> select * from manage_session;
+----------------------------------+---------+---------------------+
| sess_id                          | user_id | lastlogin           |
+----------------------------------+---------+---------------------+
| 412732ewsdsd32ds323232ffds31dshr2|       2 | 2010-09-16 15:22:16 | 
+----------------------------------+---------+---------------------+ 

Itt érdemes megemlíteni a manage_session tábla létrehozását (adtam nevet a függőségnek a későbbi könnyebb módosítás édekében):

create table manage_session( sess_id varchar(32) not null, user_id
INTEGER, lastlogin DATETIME, PRIMARY KEY (sess_id), CONSTRAINT
fk_userid_id FOREIGN KEY(user_id) REFERENCES users(user_id));

Akkor most jöjjenek a php-s részek:

Az általam használt függvények:


public function Login() {
		if (! empty ( $_POST )) {
			$logname = $_POST ['logname'];
			$logpass = $_POST ['logpass'];
		}
		if (! empty ( $logname ) && ! empty ( $logpass )) {
			$logname = addslashes ( $logname );
			$logpass = md5 ( $logpass );
			
			$check = " SELECT user_id FROM users WHERE (logname='" . $logname . "' AND logpass='" . $logpass . "') ";
			try {
				$result = connectToDb::getInstance ()->query ( $check );
			} catch ( PDOException $e ) {
				echo $e->getMessage ();
			}
			if ($result->rowCount () !== 0) {
				foreach ( $result as $row ) { $user_id = $row ['user_id'];}
				$_SESSION['user_id'] = $user_id;				
				$sess_id = session_id ();
				$replace = "REPLACE INTO manage_session (sess_id,user_id,lastlogin) VALUES ('" . $sess_id . "','" . $user_id . "', NOW() )";
				$result = connectToDb::getInstance ()->query ( $replace );
				header ( "Location: /szakdoga/new/useriface.php" );
			}
		
		}
	}
	
	public function isLogged() {	
		session_set_cookie_params ( 3600 * 24 * 365 ); //egy év
		session_start ();
		if (empty ( $_SESSION ['user_id'] )) {
			$sess_id = session_id ();
			$check = "SELECT user_id FROM manage_session WHERE sess_id = '" . $sess_id . "' ";
			try {
				$result = connectToDb::getInstance ()->query ( $check );
			} catch ( PDOException $e ) {
				echo $e->getMessage ();
			}
			foreach ( $result as $row ) { $user_id = $row ['user_id'];	}
					
			if ( $user_id > 0) {
				$_SESSION['user_id'] = $user_id;
			} else {
				header ( 'Location: /szakdoga/new/index.php' );
				exit ();
			}
		}
	}
	
	public function delSess()
	{
		$sess_id = session_id ();
        $del_sess = "DELETE FROM manage_session WHERE sess_id = '".$sess_id."'";
 		try {
			$result = connectToDb::getInstance ()->query ( $del_sess );
		} catch ( PDOException $e ) {
			echo $e->getMessage ();
		}
		
		
	}

A Login() fgv-t az index.php-ban hívom meg, az isLogged()-et minden védett oldal legelején, a delSess()-t pedig a logut.php-ban.

Ha van benne valami hiba, backdoor vagy bug akkor pls szóljatok.

Köszi mégegyszer rootkit-nek!

szerk: Azért nem raktam a kódot fel valamilyen pastebin oldalra. Mert azt tapasztaltam, hogy mikor olvasok mondjuk egy 2 éves postot akkor az esetek 99%-ban, az ott lévő linkek már halottak lesznek. Így meg legalább megmarad, úgyse zavar senkit.

PhpMailer VS. SMTP [Megoldva]

Sziasztok!

Napok óta próbálkozom már azzal, hogy el tudjak küldeni egy levelet PHP-ből a GMail SMTP szervere segítségével.



<?php
	require("class.phpmailer.php");
	$mailer = new PHPMailer();
	$mailer->IsSMTP();
	$mailer->Host = 'ssl://smtp.gmail.com';
	$mailer->SMTPSecure = "tls";                 // sets the prefix to the servier
	$mailer->Port = 587;
	$mailer->SMTPAuth = TRUE;
	$mailer->Username = 'sajat@gmail.com';  // Change this to your gmail adress
	$mailer->Password = 'jelszo';  // Change this to your gmail password
	$mailer->From = 'sajat@gmail.com';  // This HAVE TO be your gmail adress
	$mailer->FromName = 'fake'; // This is the from name in the email, you can put anything you like here
	$mailer->Body = 'This is the main body of the email';
	$mailer->Subject = 'This is the subject of the email';
	$mailer->AddAddress('cimzett@gmail.com');  // This is where you put the email adress of the person you want to mail
	
	if(!$mailer->Send())
	{
	   echo "Message was not sent<br/ >";
	   echo "Mailer Error: " . $mailer->ErrorInfo;
	}
	else
	{
	   echo "Message has been sent";
	}
?>

folyton a következő hibaüzenetet kapom:

SMTP Error: Could not connect to SMTP host. Message was not sent
Mailer Error: SMTP Error: Could not connect to SMTP host.

Az ISP és a tűzfal nem blokkolhatja, mivel a Thunderbird beállításai ugyanezek és azzal tudok levelet fogadni és küldeni.

A php.ini a következőket tartalmazza:

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = postmaster@localhost

---------

Windows 7, EasyPHP 5.3.0 (PHP 5.3.0)

Mi lehet a gond?

Köszi.
MysteryKe.

phpbb_plusz_gmail_smtp

Udvozlok mindenkit!

Lehet, hogy leragott csont mar, es guglit is hasznaltam, ott azonban nem volt teljesen egyertelmu.
Az alabbit szeretnem megvalositani:

Szeretnek egy otthoni gepembol egy NAGYON ALAP phpbb s forummotort faragni. Ezzel nem lenne semmi gond sem de amit szeretnek rajta valtoztatni:

Szeretnem ha a forum a tagok altal megadott mailcimekre a gmail SMTP szerveren keresztulk kuldene uzeneteket.Tehat, ha Joska PÜ t kuldene Pistanak, akkor pista citromail es cimere a forum a gmail SMTP szerveren kuldene olyat, hogy "új PÜ d erkezett!"

Nem azt kerem a tisztelt forumozoktol, hogy csinaljak meg nekem, csupan szeretnek egy ilyen diszkussziot a HUP on, mert ahogyan lattam a neten nem kering ilyesmi. Tehat annyi, hogy megvalosithato e, csinalt e mar valaki ilyet?
Ugy tudom, hogy a phpmailer es a php.ini piszkalasa a modszer ami ilyenkor javallott.

Elore is koszonom,szep napot,

Roy