Construirea automată a proiectelor PHP folosind PhiNG. Cum să aducă totul împreună

Jenkins? Asamblare? PHP? - intrebi si faci ochi surprinsi O_o. Ce legătură are ansamblul proiectului care vine în mod natural în majoritatea limbajelor compilate precum C sau Java cu proiectele PHP? Ele nu sunt compilate și nu „asamblate”.

Când am căutat materiale despre integrarea continuă, nu am găsit un singur articol simplu care să explice în rusă simplă de ce (de ce) este nevoie de toate acestea în raport cu PHP. Prin urmare, în această postare vă voi spune, în primul rând, ce este și, în al doilea rând, cum să îl utilizați în viața de zi cu zi.

Pentru cine este această postare:

Dezvoltatori, lideri de echipă și manageri de proiect care au ajuns la ideea de a oferi noi versiuni produs software(chiar și în PHP) ar trebui să fie stabil și regulat, ca pe linia de asamblare a unei fabrici japoneze. Este recomandabil ca cuvintele „testare automată” și „implementare” să nu fie o expresie goală pentru dvs. Sau cel puțin ești interesat de cum să (la naiba) să nu mai postezi actualizări „importante”.

De asemenea, postarea poate fi utilă pentru echipele conduse de un marketer tipic sau alt specialist în științe umaniste și sunt nevoiți să controleze cel puțin calitatea codului în interior.

Pentru că vreau să scriu post de recenzie, nu instrucțiuni pas cu pas pentru manechini, în primul rând concepte de bază pe Exemplu Ubuntu Server:

sudo apt-cache search – caută numele pachetului;
sudo apt-get install – instalați numele pachetului;
pear list -a – listă pachetele instalate PARĂ;
pear config-set auto-discover 1 – auto-descoperire canale PEAR (convenient pentru a nu adăuga aceste canale manual);
pear install –alldeps – instalează numele pachetului PEAR cu toate dependențele.

Teorie:

Nu necesită asamblare caz general, nu în proiecte PHP. Prin urmare, uitați cuvântul „construiți” și gândiți-vă la un set de câteva proceduri importante care ar trebui finalizate în mod regulat conform unui program sau înainte de următoarea lansare a proiectului. Aceasta ar putea fi o postare noua versiune actualizare de produs sau site sau alt eveniment.

Ideea este că zi după zi comiteți, comiteți, comiteți modificări și, periodic, doriți să verificați dacă ceva este stricat? Funcționează toate funcțiile de afaceri? S-a încurcat noul angajat? A învățat în sfârșit tipul ăla leneș din colț cum să folosească corect majusculele Camel în nume și să folosească indentările și parantezele acceptate de echipă? Nu crește volumul de cod „mort” care nu mai este folosit nicăieri? Ce zici de copy-paste fără minte, clase redundante, variabile neutilizate?

Și ca orice om leneș normal, vrei să faci toate acestea automat. Și dacă ceva nu este în regulă, atunci atât tu, cât și vinovatul specific trebuie să primiți un raport. Deci, să presupunem că aveți un server cu Linux la bord, unde există un mediu web și unde știți deja cum să implementați un proiect din svn/git/etc.

Instrumente:

Jenkins este un „server” de integrare continuă scris în Java infernal, cu o interfață grafică groaznică și un „server” de integrare continuă infernal de lentă. Aproape că nu are sens în el, cu excepția faptului că este o bază gata făcută pentru sarcinile enumerate. El însuși nu poate face aproape nimic, ci gestionează doar procese și pluginuri terțe. După cum va deveni clar mai târziu, de asta avem nevoie.

Ant este un program modest pentru executarea unui set de comenzi shell în Linux. Diferă de un simplu fișier sh prin mai multe caracteristici utile, cum ar fi o sintaxă convenabilă pentru manipularea fișierelor și directoarelor, ordinea și dependențele executării sarcinilor și alte lucruri mici. Este configurat într-un simplu fișier xml, nimic complicat. Folosit pentru a rula secvențial următoarele instrumente. Poate fi folosit și pentru „curățare” fișiere temporare, asamblarea documentației (PHPDoc), compresia fișierelor CSS/JS și orice alte sarcini.

Phpunit este o aplicație (în esență un set de scripturi PHP) pentru rularea de teste automate pentru produsul dvs. De ce scriu „aplicație” - pentru că este convenabil să o lansez de la linie de comandă si are multe diverși parametri. Pe lângă testele reale, poate desena imagini ale acoperirii testelor a proiectului dumneavoastră.

PHP CodeSniffer este un pachet PEAR care monitorizează conformitatea cu standardele de codare (indentări, lungimi de linii, nume de variabile etc.). Puteți utiliza standarde gata făcute sau puteți scrie propriile dvs. Dacă echipa ta are holiwars precum „4 spații versus file” sau „ar trebui ca spațiile să separe punctele în concatenarea șirurilor” furie în fiecare zi, asta este.

PHP Mess Detector este unul dintre cele mai utile pachete PEAR din această colecție. Menține calitatea codului din punctul de vedere al codului (nu al stilului său de scriere). De exemplu, el vă va reproșa dacă aveți prea multe metode publice în clasă. În general, vă va spune unde vă așteaptă refactorizarea.

PHP Copy/Paste Detector – după cum sugerează și numele, un pachet PEAR pentru urmărirea copy-paste. Nu copiați și lipiți fără minte, vă amintiți?

PHP Dead Code Detector este un alt pachet PEAR cu un nume care se explică de la sine. Găsește secțiuni de cod neutilizate. Apropo, acesta este singurul pachet pe care nu l-am putut atașa lui Jenkins (dacă știi cum, bine ai venit în comentariu).

PHP Depend este cel mai infernal de neînțeles pachet PEAR care se construiește grafică complexăși „piramide” de dependențe, heritabilitate și multe altele. Merită să îl folosiți dacă v-ați dat deja seama de orice altceva.

De asemenea, trebuie să instalați un set de pluginuri pentru pachet Jenkins-PHP urmând exemplul de pe site-ul jenkins-php.org (instalarea manuală prin panoul de administrare durează o oră, deci folosiți comenzile gata făcute din paragraful „utilizarea Jenkins CLI”).

Cum să puneți totul împreună:

Deci, ați luat un server Linux separat și ați instalat acolo toate aceste echipamente. Mai întâi trebuie să vă decideți asupra unui director de lucru. Va fi convenabil dacă acesta este un director la un nivel superior în raport cu locul în care proiectul dvs. este implementat din sistemul de control al versiunilor.

Acum trebuie să configurați Ant, și anume să compuneți pentru el fișier de configurare build.xml în directorul de lucru pe care l-ați definit în paragraful de mai sus. Există documente excelente pentru Ant, căutați pe google și obțineți exemple. Personal, folosesc Ant pentru a rula teste și toate analizoarele de mai sus. Rezultatele muncii lor sunt compilate într-un subdirector special.

Apoi trebuie să creați un proiect (sarcină) în Jenkins. Există și documente gata făcute pentru asta, voi menționa câteva puncte importante:

– verificați dacă directorul de bază corect este utilizat în setările proiectului, deoarece căile către fișierele rezultate vor fi specificate relativ la acesta;
– configurați o actualizare din sistemul de control al versiunilor;
– în secțiunea „Acțiuni post-build”, conectați pluginurile: PMD, Checkstyle, Duplicate code, Coverage (Clover), JDepend și altele după gustul dvs.

Care ar trebui să fie rezultatul:

Făcând clic pe „Build Now” ar trebui să înceapă procesul de construire. Găsiți un articol cu ​​un nume precum „Vizualizare consolă” (traducerea este șchiopătă, da) - și acolo veți vedea întregul jurnal a ceea ce se întâmplă. De exemplu, pașii ar putea fi:

– actualizare din sistemul de control al versiunilor;
– lansează Ant, care va lansa phpunit, phpmd, phpcs etc. în sine;
– analizarea rezultatelor specificate de dvs. în acțiunile post-build.

Drept urmare, veți obține o grămadă diverse statistici despre ceea ce se întâmplă în proiectul dvs. la momentul acestei „construcții”. Nu numai rezultatele testelor, ci și rezultatele analizoarelor de mai sus. Jenkins îl afișează într-o formă relativ lizibilă chiar în browser.

Iată cum arată pagina de rezumat a proiectului:

De continuat (cu poze si sfaturi).

Am un script PHP care are o gamă largă de oameni, își preia datele dintr-o resursă externă prin SOAP, modifică datele și le trimite înapoi. Datorita dimensiunii pieselor am crescut memoria PHP la 128 MB. După aproximativ 4 ore de alergare (probabil va dura 4 zile), a rămas fără memorie. Iată elementele de bază despre ceea ce face:

$people = getPeople(); foreach ($oameni ca $persoană) ( $date = get_personal_data(); if ($date == "blah") ( importToPerson("blah", $person); ) else ( importToPerson("else", $person); ) )

După ce a rămas fără memorie și s-a prăbușit, am decis să inițializez $data înainte de bucla foreach și, conform topului, utilizarea memoriei pentru proces nu a depășit 7,8% și a durat 12 ore.

Deci întrebarea mea este: colecția de gunoi PHP nu rulează pe variabile inițializate într-o buclă, chiar dacă sunt reutilizate? Sistemul este o remediere a memoriei și PHP nu l-a marcat încă ca util și în cele din urmă se va bloca din nou (l-am crescut la 256 MB, așa că am schimbat 2 lucruri și nu sunt sigur dacă l-am remediat, probabil că aș putea schimba scriptul înapoi pentru a răspunde această întrebare, dar nu vrei să aștepți încă 12 ore până să se prăbușească pentru a-ți da seama)?

Nu folosesc cadrul Zend, așa că nu cred că o altă întrebare ca aceasta este relevantă.

EDIT: Nu am nicio problemă cu scriptul sau cu ceea ce face. Pe în acest moment, in ceea ce priveste intregul sistem, nu am probleme. Această întrebare este despre colectorul de gunoi și cum/când recuperează resursele într-o buclă foreach și/sau despre modul în care sistemul raportează utilizarea memoriei într-un proces php.

2 raspunsuri

Nu cunosc elementele interne ale PHP VM, dar din experiența mea nu este un gunoi colectat atâta timp cât pagina dvs. rulează. Acest lucru se datorează faptului că îți șterge întreaga pagină când se epuizează.

În majoritatea cazurilor, când o pagină rămâne fără memorie și limita este destul de mare (și 128 MB este scăzut), există o problemă cu algoritmul. Mulți programatori PHP colectează o structură de date și apoi îi transmit următorul pas, care iterează printr-o structură, creând de obicei o alta. Udați, clătiți, repetați. Din păcate, această abordare este un succes mare de memorie și creați mai multe copii ale datelor dvs. în memorie. Două dintre cele foarte mari schimbariîn PHP 5, obiectele sunt numărate mai degrabă decât copiate, iar întregul subsistem de șiruri rulează mult mai rapid. Dar este încă o problemă.

Pentru a minimiza utilizarea memoriei, ar trebui să vă uitați la restructurarea algoritmului, astfel încât să poată funcționa pe o singură bucată de date de la început până la sfârșit. Apoi îl primiți pe următorul și începeți din nou. Cel mai bun scenariu este că nu ați avut niciodată întregul set de date în memorie. Pentru un site web activat pentru baze de date, aceasta ar însemna procesarea unui rând de date dintr-o interogare de bază de date printr-o prezentare până la primirea următoarei. Desigur, această abordare nu este întotdeauna posibilă, iar scriptul trebuie pur și simplu să fie stocat cantitate uriașă date din memorie.

Cu toate acestea, puteți face această abordare de economisire a memoriei pentru o parte a datelor. Trucul este că dezactivați în mod explicit () o variabilă cheie sau două la sfârșitul buclei. Acest lucru ar trebui să redea spațiul. Un alt truc de „cele mai bune practici” este să ieși din procesarea datelor în buclă, care nu ar trebui să fie în buclă. După cum se pare că ai descoperit.

ma lansez Scripturi PHP care necesită 1 GB de memorie. De fapt, puteți seta limita de memorie pe un script folosind ini_set("memory_limit", "1G");

În timpul procesului de colectare a datelor, colectorii noștri vor lucra non-stop și trebuie să le monitorizăm performanța. De exemplu, serverul s-a prăbușit, condițiile de colectare s-au schimbat sau luminile pur și simplu s-au stins. Pentru a nu monitoriza în mod constant lucrările, este necesar un mecanism care să notifice colectorii de date despre progresul lucrării...

În articolele anterioare, am descris cum să creați colectori de căutare multi-threaded în PHP folosind următoarele sisteme: Google Suggest - colector de sugestii de căutare Google Yandex Sugerare - colector de sugestii de căutare Yandex Rambler Suggest - un colecționar de sfaturi de căutare Rambler Nigma Suggest - un colecționar de sfaturi de căutare Nigma...

Să mergem mai departe în locurile unde poți ajunge sfaturi de căutare. Următorul motor de căutare este Rambler. De asemenea, puteți obține interogări de căutare destul de decente de la acesta. Căutând pe Internet, constatăm că următoarea adresă este folosită pentru solicitări. Toate acestea se potrivesc bine cu...

Un alt loc unde puteți obține interogări de căutare sunt sfaturi motor de căutare Nigma.ru. Tastând în el, de exemplu, „termeni de căutare” obținem următoarele: După ce am căutat pe Internet, determinăm că solicitarea de sfaturi de căutare se duce la următoarea adresă. Adică la final...

Când introducem cuvinte pe Google, ni se oferă anumite sugestii de căutare. Adică, de exemplu, la intrarea în automatizarea afacerilor, Google ne oferă următoarele opțiuni interogări de căutare: Căutând pe Internet, puteți găsi adresa URL la care sunt solicitate aceste date: adică chiar în...

În postările anterioare, am creat un colector de motoare de căutare cu mai multe fire rezultate Google API în PHP. Din experiență, s-a dovedit că viteza de funcționare a acestuia depindea în mare măsură de calitatea proxy-urilor utilizate. Astăzi am modificat mecanismul de utilizare a proxy-urilor în acest colector. Pentru aceasta a existat un complet...

Bibliotecă de suport pentru Căutare DNS.

  • Numărul 4 completări la partea matematică.
  • Win32Build biblioteci gata făcute necesare pentru asamblare.
  • mssql biblioteci pentru programare sub MS SQL 6.5.
  • Client CVS pentru depozitul CVS trebuie să descărcați cod sursă PHP.
  • Veți avea nevoie și de fișiere din MSVC++ 6.0 (numai pentru utilizatorii MSVC++ 5.0)

    • OLE- pune în VC\include. Necesar pentru suport COM.
    • HTTP- redenumiți-le pe cele existente în *.hold și puneți altele noi în VC\include. Necesar pentru a construi filtrul ISAPI.

    INSTALARE

    Instalăm pachetul CYGWIN, de exemplu în directorul C:\Program Files\Cygnus, în NT trebuie să creați variabila de mediu CYGWIN cu valoarea %SystemDrive%\Program Files\cygnus\cygwin-b20

    Acest lucru se face astfel: Mergeți la Start->Setări->Panou de control, lansați comanda rapidă System, selectați cardul Environment de pe ea, faceți clic pe fereastra System variables din partea de jos, două linii Variable și Value, în linia Variabil scrieți CYGWIN și în linia Value %SystemDrive%\Program Files \cygnus\cygwin-b20 Și faceți clic pe Set și apoi pe Aplicare.

    Creăm de la rădăcină Directorul Tmp pe disc de sistemși în același mod adăugați variabila TMP cu valoarea %SystemDrive%\Tmp. Adaugă la variabila cale calea %SystemDrive%\Tmp

    Faceți clic pe Aplicare și OK. După aceasta, trebuie să reporniți.

    Extindeți arhiva win32build.zip într-un director, de exemplu C:\Win32build

    Lansați mediul MSVC++ 5.0, mergeți la Instrumente->Opțiuni pe cardul Director și adăugați la secțiuni

    • Include
    • Biblioteci

    respectiv următoarele căi:

    • C:\Program Files\cygnus\cygwin-b20\H-i586-cygwin32\bin
    • C:\Win32Build\include
    • C:\Win32Build\lib

    Extindeți Bindlib_w32.zip într-un director, de exemplu C:\Bindlib, căutați fișierul de proiect bindlib.dsp în el și colectați-l din mediul MSVC. resolve.lib va ​​apărea în directorul C:\Bindlib\Debug, trebuie rescris în directorul C:\Win32Build\Lib deasupra celui vechi.

    ASAMBLARE

    Mergem în directorul C:\Php4\Tsrm și colectăm TSRM.dsp, după asamblare, Tsrm.lib va ​​apărea în directorul C:\Php4\Tsrm\Debug, copiați-l în directorul C:\Win32Build\Lib.

    Accesați directorul C:\Php4\Zend, deschideți proiectul ZendTS.dsp și construiți-l după asamblare, biblioteca ZendTS.lib va ​​apărea în directorul C:\Php4\Zend\Debug, copiați-o în C:\. Directorul Win32Build\Lib.

    Accesați directorul C:\Php4 și deschideți proiectul php4ts.dsp. Există 4 proiecte în el, mai întâi colectăm php4ts (nu uitați să setați proiectul activ Project->Set Active Project->php4ts).

    După asamblare, fișierul php4ts.lib, php4ts.dll, php.exe va apărea în directorul C:\Php4\Debug. Php4ts.lib este copiat din nou în C:\Win32Build\Lib. Această bibliotecă este necesară pentru a construi module externe php, de exemplu pentru modulul de suport mssql.

    Să activăm proiectul php4isapi și să-l construim. În directorul C:\php4\sapi\isapi\debug va fi php4isapi.dll – un filtru pentru IIS.

    Erori cunoscute care interferează foarte mult cu munca și modalitățile de a le trata

    1. Datele cu dimensiunea mai mare de 4K nu sunt postate prin elemente de formular; fișierele cu dimensiunea mai mare de 4K nu sunt încărcate. Procesul php4.exe se blochează și poate fi șters doar repornind IIS. (Am depus un raport de eroare, dar când o remediază, nu este clar, voi încerca să o repar eu însumi Soluție: funcționează). folosind php 3.12-3.14 pentru procesarea fișierelor formular react. Mai lent, dar funcționează.

    2. Când este executat cod dinamicîn care sunt utilizate variabile serializate, analizatorul emite un mesaj de eroare. De exemplu:

    Rezultat: eroare parser pe linia 5....

    Acest lucru se întâmplă deoarece în versiunea 4 simbolurile () sunt folosite pentru a încapsula variabile într-un șir, de exemplu $a=”Acesta este elementul ($NotSer)”;

    Dar reprezentarea serializată a unui tablou conține și caractere ().

    În exemplul descris mai sus, analizatorul încearcă să încapsuleze o expresie, care de fapt nu este o expresie și, în mod natural, eșuează cu o eroare.

    Soluție: Trebuie să corectați codul din fișierul \php4\ext\standard\var.c, înlocuind ( cu [ și ) cu ]. Căutăm subșirul %d:( în fișier și îl înlocuim cu %d:[ (vor fi două înlocuiri) și schimbăm ( cu [, În linia dacă (**p != ":" || *) ((*p) + 1 ) != "(") înlocuind ( cu [, pentru liniile pentru ((*p) += 2; **p && **p != ")" && i > 0; i- -) și returnăm *(( *p)++) == ")"; apoi reconstruim php4ts.dsp.

    Crearea modulului betta PHP 4.03 pentru MS SQL 6.5 (mssql.dll)

    Despachetați mssql.zip. *.lib este aruncat în C:\Win32Build\Lib și *.h în C:\Win32Build\Include.