Използване на инструмента Phing за създаване на PHP приложения Повече за инструмента Phing, базиран на Apache Ant, използван за създаване и организиране на проекти. Нели Тодорова Software Development Manager - LAMP, MentorMate Случвало ли ви се е да разработвате голям проект с помощта на PHP, който да включва изпълнение на множество команди и операции като създаване или обновяване на базата от данни, копиране на файлове, стартиране на тестове и други операции на различни среди като development, staging или production? А ползвали ли сте Continuous Integration за тази цел? Ако отговорът на някои от тези въпроси е да, то със сигурност Phing e инструмент, който може да ви помогне да избегнете изпълнението на множество еднакви задачи и команди на различните среди. Phing е PHP система или инструмент, използван за създаване и организиране на проекти, който e базиран на Apache Ant. Phing е създаден за PHP версия 5, като работи на UNIX, Windows и Mac OSX операционни системи. Дава възможност за изпълнение на задачи като: засичане на грешки в кода; continuous testing; автоматично документиране; PHPUnit тестване; файлови операции; XSLT транформации; изпълнение на SQL заявки; Version Control операции (SVN/GIT/CVS); генериране на документация с помощта на DocBlox, PhpDocumentor; и много, много други. Всички тези задачи могат да се изпълняват последователно чрез XML build файл. С негова помощ се избягва ръчното изпълнение на команди и следователно значително се намалява шансът за допускане на грешки. Още повече, че ако се придържате към Continuous Integration, всички тези стъпки ще трябва да бъдат изпълнявани мнoгократно много пъти. Phing е полезен за избягване на подобни ситуации, като автоматизира целия процес на миграция. Но нека първо да видим какво е необходимо за неговото инсталиране на сървър. Инсталиране Представените команди се изполват под операционната система Линукс, но и за останалите операционни системи са аналогични. Преди да инсталираме Phing, е необходимо да се инсталира и самото PHP, като минималната версия, с която може да работи, е 5. Предпочитаният метод за инсталиране на Phing е през Phing PEAR канал. Преди да бъде инсталиран, PEAR каналът трябва да се регистрира с локалната PEAR среда чрез следната команда: sudo pear channel-discover pear.phing.info След което Phing може да бъде инсталиран чрез PEAR инсталатора с извикване на следната команда: sudo pear install phing/phing Освен чрез PEAR канал, Phing може да бъде инсталиран и чрез Composer, като се добави „phing/phing“ в секцията „require-dev“ в composer.json файла на проекта и след това се извика командата “composer install”: { "require-dev": { "phing/phing": "2.*" } } Още един начин за инсталиране на Phing е чрез PHP архивен файл, който можете да смъкнете от тук и да изпълните чрез следната команда: php phing-latest.phar И не на последно място, Phing може да се инсталира и ръчно чрез използване на архивни файлове, които можете да намерите на официалната страница на Phing. Примерен build скрипт Всеки build.xml файл се състои от набор от команди, който се поставя в главната директория на проекта. Реално Phing разпознава само този документ при стартиране на build процеса. Разбира се, не е задължително build файлът да бъде кръстен по този начин. Може да се специфицира различно име, което да бъде включено като параметър при извикване на phing командата, например: phing myFile.xml Ето и един примерен документ с изпълнение на някои основни команди: <?xml version="1.0" encoding="UTF-8"?> <project name="TestPhpProject" default="test" basedir="." description="test project"> <property name="test" value="Test Message!"/> <target name="test" depends="unitTest"> <echo msg="${test}"/> </target> <target name="unitTest"> <phpunit haltonfailure="true" printsummary="true"> <batchtest> <fileset dir="."> <include name="*Test.php"/> </fileset> </batchtest> </phpunit> </target> </project> При извикване на phing команда в директорията на проекта през конзола, ще видите резултата от изпълнението на build файла. Buildfile: /var/www/html/Phing/build.xml TestPhpProject > test: [echo] Test Message! BUILD FINISHED Total time: 0.0545 seconds <project> е главният елемент от всеки build файл. Той съдържа няколко атрибута, като default указва target-ът, който ще бъде извикан, ако няма зададен такъв по подразбиране. Освен това могат да се добавят съответно име на проекта (name), основната му директория (basedir), както и допълнително описание (description). <target> елементът се състои от набор от команди или задачи, които трябва да се изпълнят. Възможно е всеки target елемент да зависи от други, които трябва да се изпълнят преди него. В този случай се добавя допълнителен атрибут depends, където се изброяват техните имена. <echo> се използва за изпъление на конкретна задача. Phing дава възможност за извикване на много и различни задачи, като например създаване на директория с набор от поддиректории в нея. <property> дефинира стойности, които могат да бъдат използвани в последствие в други команди, под формата на променливи чрез “${“ и “}” символите. <phpunit> елементът се използва за стартиране на Unit Test Cases, които отговарят на условието *Test.php. Това се реализира с помощта на <batchtest> елемента, който събира всички файлове от всички вложени във <fieldset> елементи. В представения пример ще бъдат включени всички файлове, чиито имена завършват на Test.php. В таблица 1.1 са представени някои атрибути, които могат да бъдат използвани заедно с <phpunit> елемента. ИМЕ НА АТРИБУТ ОПИСАНИЕ ТИП СТОЙНОСТ ПО ПОДРАЗБИРАНЕ haltonerror Спира build процеса при възникване на грешка по време на изпълнението му. Boolean false haltonfailure Спира build процеса, ако някой от тестовете не се изпълни успешно. Boolean false printsummary Принтира кратка информация за всеки тест. Boolean false codecoverage Събира Code Coverage информация. Boolean false Таблица 1.1 Атрибути на <phpunit> елемента. Освен изборените команди, Phing дава възможност и за стартиране на задачи, свързани с изпълнение на SQL заявки. Обикновено това се налага при миграция на базата от данни от един сървър на друг. Ще добавим още една задача към нашия пример, която ще прави миграция на MySQL база от данни. Но преди това, за да се осъществи връзка с базата от данни, е необходимо да се създаде отделен конфигурационен файл. Ще го наречем build.properties и ще го запишем в основната директория на проекта. В него се описват всички детайли под формата на key = value стойности. В конкретния случай той ще изглежда по този начин: build.dir=../ db.host=localhost db.user=root db.pass=password db.name=phing-test progs.mysql=/usr/bin/mysql След като вече сме описали връзката към базата от данни, можем да добавим и необходимите команди във build.xml файла. <property file="./build.properties" /> <target name="migrate" description="Migrations"> <taskdef name="dbdeploy" classname="phing.tasks.ext.dbdeploy.DbDeployTask"/> <property name="build.dbdeploy.deployfile" value="deploy/scripts/deploy-${DSTAMP}${TSTAMP}.sql" /> <property name="build.dbdeploy.undofile" value="deploy/scripts/undo-${DSTAMP}${TSTAMP}.sql" /> <dbdeploy url="mysql:host=${db.host};dbname=${db.name}" userid="${db.user}" password="${db.pass}" dir="${build.dir}/db/deltas" outputfile="${build.dir}/${deployfile}" /> <exec command="${progs.mysql} -h${db.host} -u${db.user} -p${db.pass} ${db.name} ${deployfile}" dir="${build.dir}" checkreturn="true" /> </target> За да се възползваме от вградените възможностите на Phing и <dbdeploy> командата, е необходимо да създадем една допълнителна таблица, която е системна таблица и ще служи за записване на лог от Phing. CREATE TABLE changelog ( change_number BIGINT NOT NULL, delta_set VARCHAR(10) NOT NULL, start_dt TIMESTAMP NOT NULL, complete_dt TIMESTAMP NULL, applied_by VARCHAR(100) NOT NULL, description VARCHAR(500) NOT NULL ); ALTER TABLE changelog ADD CONSTRAINT Pkchangelog PRIMARY KEY ( change_number, delta_set ) Dbdeploy създава няколко delta файла, като всеки един от тях съдържа SQL заявки за deploy, както и за roll back сценарии, ако нещо се обърка по време на миграцията. Всеки един такъв файл съдържа следната информация: --// -- Стартирай SQL, който ще направи необходимите промени --//@UNDO -- Стартирай SQL за връщане към предишното състояние, ако нещо се обърка --// Остава само да се напишат необходимите SQL заявки и можем да започнем мигрирането на базата от данни чрез изивикване на: phing migrate В този случай като параметър задаваме името на командата – migrate. Заключение Както сами се уверихте, Phing е изключително удобен и полезен инструмент, използван за изпълнение на последователност от команди и задачи. Естествено, тук не са показани много от наличните команди, но въпреки това успяхме да засегнем някои от основните му възможности. Силно ви препоръчвам да прочете официалната му документация, за да се запознаете в дълбочина с множеството възможности, които предоставя. Tags Софтуерни разработкиУеб Сподели Facebook LinkedIn Twitter Сподели Facebook LinkedIn Twitter Запишете се за нашия бюлетин Запишете се за нашия бюлетин