Jump to content
php.lv forumi

apc kopā ar zend frameworku.


Maris-S

Recommended Posts

Sakonfigurēju php ar php_apc.dll, lai varētu izveidot uploada progress baru. Viss smuki sanāca, bet reālais projekts, kur to vajag, ir sataisīts ar zend framework. Problēma tā ka ja es mēģinu ielādēt uz zenda izveidoto lapu, tad uzkarās apache, logos parādās šāda kļūda:

 

[apc-error] Cannot redeclare class zend_controller_action_helperbroker

 

Vai ir iespējams šo apc moduli darbināt ar zend frameworku, varbūt kāds ir saskāries ar līdzīgu problēmu un sanācis viņu atrisināt?

Link to comment
Share on other sites

Ar vien vairāk sāk izskatīties ka pie dažādiem nosacījumiem apc modulis varētu nestrādāt ar lapu, kas saprogrammēta OOP, neesmu par to pārliecināts, bet tāda aizdoma. Divas reizes klase nav ievietota, disablojot apc kods smuki sāk strādāt.

Edited by Maris-S
Link to comment
Share on other sites

Tur nav kaut kas ar to bloat'oto ZF veidu faila includošanai?

Pamēģini kaut kur pielikt parastu require_once('zend/controller/action/helperbroker.php') vai arī failā zend/controller/action/helperbroker.php esošo kodu ielikt

if(class_exists('Zend_Controller_Action_Helperbroker') == false) { ... }

Link to comment
Share on other sites

Bišku veicu dažāduz mēģinājumus ar apc. Jo vairāk es viņu pētu, jo vairāk nesaprotu. Izskatās ka ar OOP nav nekāda sakara, var viņš strādāt ar php klasēm mierīgi. Mēģinot atrast kļūdas komentēju koda daļas, lai atrastu atbilstošās vietas, kurās ir kļūdas. Pēc vairākiem komentāriem protams viss aizgāja. Pa bišķiņai komentārus samazinot nonācu līdz tam, ka atkomentēju visu atpakaļ un kods palika tāds kā viņam jābūt un kā par brīnumu viss sāka strādāt, kaut gan pēc loģikas nevajadzētu tā būt. Izmēģinot tālāk atklājās, ka tomēr dažas sadaļas turpināja nestrādāt, lai salabotu arī tās vajadzēja vienkārši atbilstošajos failos veikt kaut kādu izmaiņu (kaut vai tukšu rindiņu pievienot) un sāka strādāt arī viņas.

 

Secinājums ir tāds, ka apc jau izveidotos failus vai nu sakešo nepareizi, vai arī vispār nekešo (nu vismaz dažreiz). Pēc noklusētiem uzstādījumiem apc sakešo failus, kuros ir izmaiņas. Loģiski jau būtu ka jaunu kodu, kuru viņš nav redzējis vispār, arī kešotu pilnībā. Gan jau ka viņš to dara, bet izskatās ka nevisai pareizi. Vēl dīvaini ir tas ka ne visos failos veicu izmaiņas, lai viņus sakešo, daži (lielākā daļa) aizgāja bez izmaiņām, pārsvarā vajadzēja mainīt klašu failus un tikai dažus vienkāršus php kodiņa failus.

Link to comment
Share on other sites

Visumā sapratu ka kešošanai šis modulis galīgi neder. Nomainīju visiem failiem date modified un vispār pārstāja strādāt.

 

Tomēr, galvenais mērķis man ir iegūt failu augšupielādes progresa rādītāju, tāpēc koncentrējos uz šo padarīšanu. Varbūt ja kādam interesē risinājums, tad php.ini failā jāatslēdz apc.cache_by_default:

 

apc.cache_by_default = Off

 

Noklusēti ir ieslēgta, ja viņu atslēdz, tad kešošana notiek pēc filtriem (nav ne jausmas kas viņi ir), bet visumā sanāk ka viņš neko vairs nekešo kamēr to filtru nav un augšupielādes progresa rādīšanai tā pietiek.

Link to comment
Share on other sites

Visumā sapratu ka kešošanai šis modulis galīgi neder.

Tāda abominācija... No bez maksas pieejamiem PHP opcode cachiem šis tomēr ir vislabākais. Plus arī user cache API strādā lieliski. Pagaidām nav bijušas problēmas ar APC. Vabūt tomēr esi atradis bugu? Pamēģini kārtīgi izdebugot un atrast kurš tieši koda gabals rada problēmas...

Link to comment
Share on other sites

Tur jau tā lieta ka nav tāda konkrēta koda gabala, kā jau teicu, sākumā, kamēr nenomainīju failiem modificēšanas datumu, vajadzēja vienkārši ielikt kaut kādu izmaiņu, kaut vai tukšu rindiņu, vienalga ko, lai būtu izmaiņa, vēlāk noņemot viņu arī turpināja strādāt (gala rezultātā kods bez izmaiņām), vēl pamanīju, ka funkcija apc_cache_info() atgriež problemātiskos failus deleted_list masīvā, ko viņš nozīmē es nezinu, dokumentācijā neatradu, pēc loģikas spriežot vajadzētu tā kā būt failam, kurus viņš negrib sakešot vai kaut kā tam līdzīgi. Pie tam kā deleted viņi parādījās tikai tad, kad tā lapa daudz maz aizgāja, jo pirms tam (arī tagad pēc failu modifikācijas datuma nomaiņas) vienkārši nobrūk apache logos ierakstot kļūdu par kādas klases pārdefinēšanu:

 

[Tue Jun 09 16:58:27 2009] [apc-error] Cannot redeclare class zend_registry in D:\web\agora\Zend\Loader.php on line 178.
[Tue Jun 09 16:58:32 2009] [crit] Parent: child process exited with status 2 -- Aborting.

 

Pirms es nomainīju failu modificēšanas datumus vismaz sanāca panākt, ka apache nenobrūk, vienīgi faili, kas izraisīja problēmas, vienkārši nenolasījās, tā koda daļa vienkārši nebija (dažiem failiem man ir vienkārši includoti valodu mainīgi, tāpēc sapratu ka koda daļa iztrūkst), apache error logos sekojošs paziņojums:

 

[Tue Jun 09 13:09:05 2009] [notice] Apache/2.2.11 (Win32) PHP/5.2.9-2 configured -- resuming normal operations
[Tue Jun 09 13:09:05 2009] [notice] Server built: Dec 10 2008 00:10:06
[Tue Jun 09 13:09:05 2009] [notice] Parent: Created child process 640
[Tue Jun 09 13:09:05 2009] [notice] Child 640: Child process is running
[Tue Jun 09 13:09:05 2009] [notice] Child 640: Acquired the start mutex.
[Tue Jun 09 13:09:05 2009] [notice] Child 640: Starting 64 worker threads.
[Tue Jun 09 13:09:05 2009] [notice] Child 640: Starting thread to listen on port 80.

 

Iespējams ka modulim nav ne vainas, vienīgi nezinu kāpēc viņš negrib strādāt, iespējams, ka viņš tā uzvedās pie konkrētiem nosacījumiem, jo uz maza atsevišķa koda man nesanāca atkārtot problēmu. Ja kļūdu paziņojumā ieraksta ka tiek pārdefinēta klase, iespējams ka sakešotu kodu kāda iemesla pēc izpilda divas reizes, kaut gan diezvai. Vēl ko pamanīju, ir tā ka problemātiskie failiem (pārsvarā, ne visiem) modificēšanas datums bija janvārī, tātad pus gadu neaiztikti, diezvai tas kaut ko ietekmē, visdrīzāk sakritība.

Link to comment
Share on other sites

Apache configā neko neesmu licis saistībā ar apc, php.ini sekojošs:

 

[APC]
apc.rfc1867 = On
apc.max_file_size = 500M
apc.include_once_override = On
apc.cache_by_default = Off
apc.rfc1867_freq = 1k

extension=php_apc.dll

 

Šajā gadījumā ir apc.cache_by_default = Off, sākumā protams nebij šīs rindiņas.

 

Iespējams ka gļukojas lapa kā tāda. Tur ir diezgan daudz includes un arī zend frameworkā taisītie kontrolieri samērā palieli. Vispār tā lapa ir pasmaga, man uzreiz likās ka labāk ar zendu viņu neprogramēt, arī te forumos izteicās ka veiktspējas ziņā zend frameworks lielākām lapām nevisai spīdošs. Tagad ir tā, ka manā lokālajā kompī ātri refrešojot lapu var nobrucināt apache (pieaug apache procesam izmantotā operatīvā atmiņa un pārstartē servisu), pēc sistēmas pārinstalēšanas arī tas pats. Nu vismaz serverus, kur šī lapa stāv, nevar uzkarināt. Uz serveriem apc nemēģināju likt, negribās eksperimentēt uz strādājošas sistēmas.

 

Webs darbojās uz os windows.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...