1

j'utilise dans mon framework des tableaux de fonctions, pour les callback php entre le design et les données
$clbcom = array(
	'img' => function($xml)
	{	$imgs = $xml->image;
		if(count($imgs) > 1)
		{	$out = '<div id="slideshow-comm">';
			foreach($xml->image as $img)
			{	$out .= '<img width="700" height="250" alt="'.$xml['nom'].' '.$_GET['ville'].'" src="'.$img['src'].'">';
			}
			addToJs('$("#slideshow-comm").cycle({fx:"scrollDown,fade,scrollLeft"});');
			return $out.'</div>';
		} else return '<img width="700" height="250" alt="'.$xml['nom'].' '.$_GET['ville'].'" src="'.$imgs[0]['src'].'">';
	},
	'marker' => function($xml)
	{	return ':)'.$xml['ref'];
	},
	'ref' => function($xml)
	{	return '<div><b>'.$xml['ref'].'</b></div>';
	},
on à mis 4 site en ligne avec ca, pour le même client, qui à un hébergement pourris en php4 (online.net à moins d'un euro par mois ...)
php4 ne le supporte pas, mais ce n'étais pas des gros sites et bref, fixé le tout en 10 minutes en mettant le code dans des fonctions à coté et en insérant le nom des fonctions dans le tableau..

la, le site est 50x plus grand, et jusqu'à présent, on taffais en local, et on amenais le pc portable chez le client,
la le site étant fini à 95% je veut leurs montrer sur le serveur direct (demain à 10h cheeky)

bref j'uppe, met tout en place, fixe qq bugs etc ...
aire/annuaire.php on line 22et la horreur oh désespoir, Parse error: syntax error, unexpected T_FUNCTION in /var/www/vhosts/default/htdocs/plannet/modules/annu trilove

bref, comme php 4 ce n'est pas supporté, gros gros doute, un coup de phpinfo, PHP Version 5.1.6 sur le serveur, et PHP Version 5.3.3-1 en local

bref,
* je met le serveur à jour ? (il y à une dizaine de site en ligne dessus la) des incompatibilité descendantes entre les deux release ?
* je me retape style 20 ou 30 fichiers pour extraire comme un porc les fonctions ?
* la nuit porte conseil, va avec ton pc portable demain cheeky

sachant que tout utilisera le même moteur à l'avenir (donc je serais tout le temps confronté à ce soucis) ?

le serveur est sous centos, que faire ? trifouet
et la le mec il le pécho par le bras et il lui dit '

2

(aucune idée, mais par pitié : -fixer+corriger couic)

3

et si je met résoudre confus pourquoi tu n'aime pas 'fixer' ?
Sens 1 Rendre fixe. Ex Fixer un cadre au mur. Synonyme river Anglais to fix
Sens 2 Etablir de manière durable. Ex On l'a fixé à Paris. Synonyme installer
Sens 3 Regarder avec insistance. Ex Il te fixe depuis une heure. Synonyme scruter Anglais to stare at somebody/something
Sens 4 Arrêter, régler. Ex Fixer un rendez-vous. Synonyme déterminer Anglais to decide
et la le mec il le pécho par le bras et il lui dit '

4

alors si je comprend bien le dépôt officiel de centos en est encore à la 5.1.6

il faut que j'installe depuis le dépôt de 'Remi' trifus
j'espere que ce Remi n'est pas trivil
et la le mec il le pécho par le bras et il lui dit '

5

rhaa je me suis rendu fou cheeky

remi nécessitais EPEL et j'ai mis plus de deux heure à réussir à mettre le dépôt d'epel, quelle productivité love

en tout cas ca marche, un php tout neuf, encore plus frais qu'en local happy
et la le mec il le pécho par le bras et il lui dit '

6

HAaaAAAaaaaaaaaaaaaaaAAAAAA !!!!
Deprecated: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of getmetasearch(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /var/www/vhosts/default/htdocs/plannet/common/search.php on line 43
style je vais pas passer par référence le gros tableau de 20ko gol
et la le mec il le pécho par le bras et il lui dit '

7

Là, tu as utilisé des fonctions anonymes -- qui est une des grosses nouveautés de PHP 5.3 ; et ça n'existe pas en 5.1

Fonction nommée :
function ma_fonction($param) {
    // blah
}


Fonction anonyme :
$ma_fonction = function ($param) {
    // blah
}



Un client qui te fait faire du PHP 4 ? Heu... quitte le ^^

Même du PHP 5.1... comment dire... faut arrêter d'utiliser des vieilles Redhat/CentOS toutes pourries qui fournissent des soft en versions qu'il y a 4 ans...


Pour ton problème de passage par référence : le message ne te dit pas de ne pas passer par référence.
Il te dit qu'il faut déclarer la fonction comme prenant une référence ; et non pas faire ce passage par référence à l'appel.

Fonction recevant une référence :
function plop(& $param) {

}

plop($toto);


Fonction ne recevant pas de référence, en recevant une à l'appel (deprécié) :
fonction plop($param) {

}

plop(& $toto);


Au pire, tu peux toujours modifier l'error_reporting (pour désactiver les remontées de trucs dépréciés), pour les faire disparaitre, ces messages -- en attendant de corriger ton code pas beau.
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

8

tiens on a des fonctions anonymes en php maintenant?

9

désolé mais... php complètement dépassé et mal programmé avec de gros trous de sécu... je déconseille fortement de l'utiliser !!!! un exemple : $_GET['ville'] utilisé directement sans vérification ni protection.... vive les injections de code HTML non autorisés par exemple

de plus, je conseillerais de passer par un contrôleur générique pour avoir du code clean, avec des méthodes tu style
public function imgAction() { ...}
public function markerAction() { ... }

et d'appeler la bonne méthode en faisant $objet->{$ma_var.'Action'}()

ca sera vraiment beaucoup plus propre.

ensuite pour de la prod, surtout de pas utiliser des versions de php <5.2, trop de pbs et de trous de sécu, et eviter d'utiliser utiliser >=5.3, car pas encore stable officiellement sous debian par exemple
Ancien pseudo : lolo

10

oui oui c'est ce que j'ai mis hier soir les & à la déclaration et non à l'appel, mais je trouve ca un peu violent de changer complètement la manière de faire les références avec ce langage Oo
Un client qui te fait faire du PHP 4 ? Heu... quitte le ^^
bah il nous à pris 5 sites tout de même lui, et à pas voulus notre hébergement ..
je vais pas le virer pour autant, surtout en démarrant ^^

le $_GET['ville'] est rempli par le site lui même depuis $_GET['city'], lui même rempli par la géolocalisation cheeky
bref $_GET['ville'] à été affecté et nettoyé bien en amont ^^
mais vu que les pages sont un vrai légo en 30 douze pièces, c'est plus simple de passer par $_GET, après, j'ai dit qu'il étais fini à 95% tongue
de plus, je conseillerais de passer par un contrôleur générique pour avoir du code clean, avec des méthodes tu style
public function imgAction() { ...}
public function markerAction() { ... }
et d'appeler la bonne méthode en faisant $objet->{$ma_var.'Action'}()


bah un array c'est générique non ?

en gros c'est un truc du style :
function showDesignBdd($query,$design,$callback)

ca fait la requête, récupère le design, puis remplis les $motclef$ du design avec :
- si la colonne motclef existe dans ce que retourne la requête, ce que retourne la fonction array[motclef](contenu de la colonne), ou si il n'y à pas de callback, direct le contenu de la colonne
- si la colonne existe pas dans le résultat de la requête, et qu'un callback avec ce mot clef existe, ce que retourne la fonction array[motclef](toute les colonnes)

j'ai pas envie de galérer à me créer une classe par design à afficher cheeky

un exemple concret, c'est simple et clean non ?
et encore la j'ai déclaré le design depuis php, je peu le mettre dans un fichier commun de design ou dans un fichier externe
<?php $clb = array( 'txtacc' => 'nl2br', 'liste' => function ($content) { $c = explode("\n",$content); $out = ''; foreach($c as $line) $out .= '<li>'.$line.'</li>'; return $out; } ); setConstant('prodacc','<div style="width:325px; height:430px; margin:0 10px; float:left; overflow:auto;"> <div class="prods" style="background:url(img/prod-$ref$.png) no-repeat center;"> <table width="100%"> <tr> <td height="75" valign="top"> <center> <h2>PHYTOMARIN <br /><span style=" font-variant:small-caps; color:$color$">$nom$</span></h2> <h3 style="color:#707070">PLASMA OCEANIQUE</h3> </center> </td> </tr> <tr> <td height="150" valign="top"> $liste$ </td> </tr> <tr> <td> <a class="plus-info" href="$fixed$"></a> </td> </tr> </table> </div> <p style="margin:auto; width:300px; text-align:justify; float:left;">$txtacc$</p> </div>'); bdd('produit','langue="'.TEMPLATE_URL.'"','prodacc',$clb); ?>
et la le mec il le pécho par le bras et il lui dit '

11

rah, mélange d'action et de vue... il faut utiliser des fichiers de template ! et pour l'hébergement, il faut l'imposer quand celui que le client possède est obsolète depuis 5 ans...
Ancien pseudo : lolo

12

bah je m'en tape du site du client, il en fait ce qu'il veut, ou il veut, du moment qu'il paye,
mais si j'avais du passer plus de 10 minutes pour 'fixer' grin le site pour php4 (les fonctions anonymes et deux trois trucs style scandir qui existe pas) il se serais démerdé, après comme dit plus haut quant il en prend un, qu'il est content, et en recommande 4 derrière, le client est roi
rah, mélange d'action et de vue...
ma fois certainement cheeky
je suis un petit artisans moi tongue j'avais besoin de séparer design et code, de rajouter un niveau d'abstraction supplémentaire, j'ai crée ca, après ... wink
il faut utiliser des fichiers de template

je peu mettre le code du design dans le fichier 'prodacc.php', et le caler dans un répertoire de design (ici 'fr' et 'en'), ca séparerais vraiment, mais oui les callback php resterais ici, je pourrais toujours tester la constante TEMPLATE_URL pour faire un callback suivant les cas ..

j'ai jamais utilisé un moteur de contenu style spip ou des truc similaire, donc je ne sais pas comment ils fonctionnent, j'aurais peu être du, avant de créer le mien.
enfin bref, je suis pas contre quelques conseil pour améliorer l'ergonomie et l'utilisation, bien au contraire smile
et la le mec il le pécho par le bras et il lui dit '

13

a mon avis, pour apprendre toutes les bonnes pratiques, rien de tel que de s'essayer à un bon framework (style symfony), ca apprend et ca oblige à mieux coder

voici un cours en 24 leçons : http://www.symfony-project.org/jobeet/1_4/Doctrine/en/
Ancien pseudo : lolo

14

ça a l'air extra bien. je m'étais fait une version mini de la même chose en fait love

15

symphony à l'air euh de tout sauf de t'apprendre à coder, en tout cas il est vraiment spécifique, c'est sur qu'il à l'air de s'occuper de tout, mais bon, une fois maitrisé je me vois mal passer à autre chose
<div id="jobs"> <?php foreach ($categories as $category): ?> <div class="category_<?php echo Jobeet::slugify($category->getName()) ?>"> <div class="category"> <div class="feed"> <a href="">Feed</a> </div> <h1><?php echo $category ?></h1> </div> <table class="jobs"> <?php foreach ($category->getActiveJobs() as $i => $job): ?> <tr class="<?php echo fmod($i, 2) ? 'even' : 'odd' ?>"> <td class="location"> <?php echo $job->getLocation() ?> </td> <td class="position"> <?php echo link_to($job->getPosition(), 'job_show_user', $job) ?> </td> <td class="company"> <?php echo $job->getCompany() ?> </td> </tr> <?php endforeach; ?> </table> </div> <?php endforeach; ?> </div>

je tue le graphiste si il doit toucher la dedans ^^"

la même chose (en gros) avec mon code :
<div id="jobs"> <?php $clbjob = array( 'location' => function($job){ return nl2br(trim($job['position'])); }, // mot clef virtuel, l'arg est tous le tableau de la requette 'company' => function($cpny){ return '<b>'.$cpny.'</b>'; }, // compagny est dans la table, l'arg est le champs seul 'name' => function($name){ return 'bonjour '.$name; } ); $clbcategorie = array('jobs' => function($cat) // mot clef virtuel { // obstart machin truc car bdd printe direct :/ bdd('jobs','cat="'.$cat['ref'].'"','design_job',$clbjob); // affiche les jobs de la categorie spécifié // return obgetcontent machin chose }, 'name' => 'trim' // name est dans la table, champ non virtuel, est donné direct a trim ); bdd('categorie','1','design_categorie',$clbcategorie); // recupere et affiche toute les categories ?> </div>

table> </div>
design categorie :    <div class="category_$ref$">
      <div class="category">
        <div class="feed">
          <a href="">Feed</a>
        </div>
        <h1>$name$</h1>
      </div>
      <table class="jobs">
		$jobs$
      </


td> </tr>
design job :  <tr class="$class$">
	<td class="location">
	  $location$
	</td>
	<td class="position">
	  $user$
	</td>
	<td class="company">
	  $company$
	</


le graphiste à pas une crise cardiaque, bon c'est sur ca explose dans 3 fichiers différents mais c'est "lisible"

edit : ouais je peu pas faire <tr class="<?php echo fmod($i, 2) ? 'even' : 'odd' ?>">, un design différent par ligne, à mettre dans le todo ^^
et la le mec il le pécho par le bras et il lui dit '

16

squalyl (./8) :
tiens on a des fonctions anonymes en php maintenant?

"maintenant", depuis genre un an et demie, pour PHP 5.3.0 ^^
Spipu (./9) :
et eviter d'utiliser utiliser >=5.3, car pas encore stable officiellement sous debian par exemple

avec un an et demi depuis que 5.3 a été déclarée "stable", et 6 versions mineures (de 5.3.0 à 5.3.6 en début de mois), considérant les avantages de 5.3, je trouve dommage de se limiter à 5.2 (qui, officiellement, n'est plus maintenu !), surtout pour de nouveaux projets...
r043v (./12) :
après comme dit plus haut quant il en prend un, qu'il est content, et en recommande 4 derrière, le client est roi

moué, enfin, si c'est pour recommander des projets en PHP 4... heu... comment dire ? quitte le ?
(un mec que je vois en entretien, qui me dit "je fais du php 4, et ça me convient", bah... lui il me conviendra pas ^^ )
tu peux aussi lui dire, à ton client, que les développeurs php 4 y'en aura de moins en moins, que des outils/bibliothèques php 4, y'en a de moins en moins, que des évolutions y'en a plus -- les patchs de sécurité non plus, d'ailleurs...
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

17

le client est un type qui vend sa gamme de produit, il pense argent, donc économie, il ne sait même pas ce qu'est php happy
on lui à fait ses sites, en achat direct, sans maintenances, mises à jour ni rien, bref ca me coutais pas grand chose d'adapter le moteur à php4, mais t'inquiète je l'ai maudit, surtout que les .htaccess marche pas pareil chez online cheeky

edit : c'est peu être pas clair, mais c'est pas le même client la pour le site 50x plus gros, eux ils sont pas con (enfin ca reste des clients cheeky) le site va aller sur notre serveur, que j'ai justement mis à jour, l'autre c'était des sites 'vitrine' basiques
et la le mec il le pécho par le bras et il lui dit '

18

je recycle un peu mon sujet,

je ne comprenais pas pourquoi mes pages prenais entre 4 et 5 ms à être générés, je fait qq test la ou il faut, en réalité mon moteur me charge une page complète en 2.5ms, et pratiquement le même temps est pris juste pour inclure le moteur (un unique fichier de 18ko), sachant que concrètement je n'exécute presque rien dedans à l'inclusion

j'ai testé pleins de truc, par exemple passer par redis pour stocker mon fichier (vu les excellentes perf que j'ai dessus comme cache des designs) puis lancer un eval dessus (pas taperhappy), pour à peu de chose près avoir le même temps :/

j'ai aussi vu qu'il existe bcompiler qui est censé me bytecoder à l'avance mon .php donc entre le normal et du hiphop, vous connaissez ?

questions ^^,
* ce con de php ne devrais pas bytecoder tout seul mon fichier à la première exécution ? j'ai loupé une ligne dans le .ini confus
* ai je besoin de bcompiler sur le serveur ou c'est simplement nécessaire à la création, donc pour moi en local ?
* je me prend la tête pour rien ?
* des règles particulières à mettre en place dans mon code pour accélérer le chargement ? (la par exemple j'utilise beaucoup de constantes, c'est mal ?)

tte ligne : $out = preg_replace_callback(includePattern,'showPage',$out);autre chose, le principal bouffeur de perf du moteur c'est ce
avec includePattern :
define('includeChar','§');
define('includeWordSize','4,2048');
define ('includePattern','/'.includeChar.'([^'.includeChar.']{'.includeWordSize.'})'.includeChar.'/u');
bref -> /§([^§]{4-2048})§/u
des idées pour accélérer ou remplacer la regex ? (ca va juste remplacer les §truc§ par le callback ..)
peu être la séparer en deux appels ? la plupart des mots clef sont court (style moins de 16 char) mais j'ai mis 2048 car les modules sont appelés de la mm manière §module|arg1|arg2|..|argn§ ^^
et la le mec il le pécho par le bras et il lui dit '

19

un petit apc cache, eacc, ou autre devrait faire l'affaire, et gardera le code précompilé de php en mémoire
Ancien pseudo : lolo

20

c'est passé de 2.5ms à 1ms pour charger mon include avec apc, merci !
et la le mec il le pécho par le bras et il lui dit '

21

C'est pas dangereux de garder un exécutable en cache niveau sécurité ?

22

c'est pas l'exécutable en soit, c'est le code précompilé, il n'y a pas d'executable en php wink

et sinon, je ne vois pas en quoi c'est plus dangereux qu'autre chose, tant que c'est bien fait/protégé
Ancien pseudo : lolo

23

Oué donc parlons de l'exécuté alors ^^
S'il est en cache au niveau client, qu'est-ce qui empêche le client de le changer à sa guise ? C'est pas de ça qu'il s'agit ici ?

24

lol non, c'est au niveau serveur smile le PHP n'est jamais au grand jamais envoyé au client. le client, quelque soit le site qu'il visite, n'a jamais connaissance du PHP, il ne voir que l'HTML (ou css, js, pdf, ...) généré
Ancien pseudo : lolo

25

Ok. Ben oui chsuis con, ça demanderait PHP côté client ^^

26

j'ai eu beau chercher, impossible d'utiliser redis en lieu et place d'apc

par contre le module phpredis peu gérer les sessions php avec redis, je viens de tester, c'est bien plus lent (50%!) que la gestion par fichiers, que la session soit vide ou blindée ..
je ne sais pas comment ils implémentent ca, mais avec mes test je battais largement les includes couplés avec ob_* :/

cache basique avec les hash redis :

$name,$content);// mise en cache$redis->hset(redisPrefix.':cache',ame]; return false;
// lecture du cacheif(!isset($cache)) $cache = $redis->hgetall(redisPrefix.':cache');
if(isset($cache[$name])) return $cache[$n
et la le mec il le pécho par le bras et il lui dit '

27

quelqu'un à déjà écrit un module php en C ?
l'api php est elle entièrement utilisable depuis le C ?
je vais avoir des gains significatif ?

je trouve pas grand chose comme info la dessus, ou alors ca date de 2006 avec php4 :/
et la le mec il le pécho par le bras et il lui dit '

28

Si tu écris une extension PHP en C, tu travailles au niveau "en-dessous" du PHP.
r043v (./27) :
l'api php est elle entièrement utilisable depuis le C ?

Ce que tu peux utiliser, j'imagine (jamais essayé moi-même) c'est les fonctions C qui correspondent aux fonctions exportées vers PHP ; mais pas les fonctions PHP en elle-mêmes (pas le même langage ^^ ).
r043v (./27) :
je vais avoir des gains significatif ?

Qu'est-ce que tu appelles "gains significatifs" ? Gains en quoi ? mémoire ? rapidité ? Maintenabilité ? Evolutivité ?
De manière générale, quand on écrit une extension PHP, c'est plus pour :
* ajouter ou modifier des fonctionnalités "internes" à PHP -- Cf extension XDebug, par exemple
* mettre en place une couche d'interfacage entre PHP et "autre chose" genre bibliothèque C -- cf extensions mysql, mongodb, curl, ...
r043v (./27) :
je trouve pas grand chose comme info la dessus, ou alors ca date de 2006 avec php4 :/

Effectivement, il n'existe pas des masses de documentation sur le sujet...
Cf ma réponse ici pour quelques liens intéressants : http://stackoverflow.com/questions/2574206/loading-c-libraries-from-php
(J'avais posté quelques liens vers des articles sur le sujet ; et il y a un lien vers le bouquin de Sara Golemon, dédié à ce sujet)
Cf aussi http://blog.simonholywell.com/post/1156691738/15-excellent-resources-for-php-extension-development où tu retrouveras quelques liens que j'avais posté au-dessus, plus quelques autres.

avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

29

le gain que je veut est niveau vitesse, mais vu que php devra charger mon module tout ca, je me demande si les perf gagnés par le C serons vraiment conséquentes (surtout que la je suis tombé vers les 2ms pour générer toutes les pages 'fixes')

pour l'api, c'est sur que ce n'est pas le même langage mais j'imagine que php n'est qu'un wrapper vers les fonction bas niveau composant son api, et ses type doivent être déclaré aussi dans le C

en fait mon fw étant composé d'un unique fichier, je me dit qu'il pourrais très bien être inclus directement dans php, en plus j'utilise redis avec, ca m'éviterais d'utiliser le module php de son client, quitte à installer "obligatoirement" un module autant prendre le mien, surtout que le client officiel de redis est en C.

merci pour tes liens, je vais aller lire tout ca smile
et la le mec il le pécho par le bras et il lui dit '

30

Indépendamment des aspects "fun" ou autre : 2ms pour générer une page, c'est plutôt largement pas mal ^^ va pas être évident de faire moins ^^
(maintenant, si tu as un temps de génération de page de 2ms côté serveur, il y a fort à parier que tu gagnerais plus en optimisant côté client (genre temps de chargement des pages, nombre de requetes HTTP, ...) que côté serveur ^^ )

un point non négligeable, tout de même : du code PHP, avec n'importe quel éditeur de texte, tu peux le modfier ; et les modifications sont instantanément prises en compte au prochain chargement de page (ou vidage de cache, si tu as un cache d'opcode et que la vérification de modifications de fichiers est désactivée)
par contre, avec une extension en C, débugger et patcher, ça va devenir un brin plus compliqué wink
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall