Home
About
Search
🌐
English Română
  • Parse ini files in PHP

    Citește postarea în română

    Mar 12, 2011 ini parse_ini_file PHP
    Share on:

    Why “ini” files? Because there are more convenient! Most servers in the *nix world have “ini” or “conf” configuration files. In the PHP world there are preferred PHP configuration files, which are usually arrays. Wouldn’t be more elegant to have an ini file without PHP code in it?

    Fortunately PHP has a couple of native functions just for that: parse_ini_file and parse_ini_string.

    The principle is very simple, you give an configuration ini file as a parameter and it will return an array.

    A little example:

     1;config.ini
     2
     3[simple]
     4number = 1
     5another = 2
     6fraction = 0.2
     7
     8[escape]
     9path = /usr/bin/php
    10url = https://blog.claudiupersoiu.ro
    11error = '<a href="%path%">%error%</a>'
    12
    13[array]
    141 = a
    152 = b
    163 = c
    

    To parse the previous file:

    1$config = parse_ini_file('config.ini', true);
    2var_dump($config);
    

    The second parameter specifies if the sections will become keys in the resulting array. Honestly I don’t think of a case when that wouldn’t be useful.

    Seems slow? In fact for the file above is faster to parse then to include an array already parsed. The difference on my computer is ~0.00002s.

    But the above file is not exactly big, so let’s get to a more serious ini file, like php.ini. Here the difference was bigger in favor of array, which won whit an advantage of ~0.0003, which means about half of parsing time that was ~0.0006s.

    Taking into consideration that my computer is pretty fast and concurrent request can add an overhead for big files, sometimes it is useful to use a cache of the ini file.

    Fortunately this is easy to do in PHP.

    1$cache = var_export($config, true);
    2
    3file_put_contents('cache/config.php', "<?php\n\$config = " . $cache . ';');
    

    Now you just need to include cache/config.php file and of course regenerate it when something changes in the ini file.

    PHP should have write permissions for the cache directory.

  • PHP CLI Input/Output from keyboard, pipe or arguments

    Citește postarea în română

    Feb 26, 2011 CLI PHP stderr stdin stdout
    Share on:

    Somewhere in the certification guide there is a chapter dedicated to “streams”.

    A small part of it represents the input, output and error streams from PHP.  C/C++ has famous stdio.h library, but few people knows that input from keyboard is possible in PHP too.

    In short, this can be achieved with PHP://STDIN, PHP://STDOUT and PHP://STDERR.

    As this subject is panicking a lot of developers that are studding for ZCE, let’s get the confusion out. A stream represents a flow of information, just like when your reading and internal or external file using fopen.

    But as a programmer best understands from cod, let’s get to more practical stuff.

    Input

    For input there is PHP://STDIN.

    The next script is reading input from the keyboard:

     1#!/usr/bin/php
     2<?php
     3// initializing the input stream
     4$input = fopen('php://stdin', 'r');
     5
     6// welcome message
     7echo 'Type "exit" and then enter to exit' . PHP_EOL;
     8
     9// reading the stream input
    10while($line = fgets($input, 1024)) {
    11 // exit condition with line terminator
    12 if($line == 'exit' . PHP_EOL) {
    13    echo 'bye bye' . PHP_EOL;
    14    break;
    15 }
    16 // displaying the input from the keyboard
    17 echo 'You say: ' . $line . PHP_EOL;
    18}
    19
    20// close stream
    21fclose($input);
    

    The first line of code is specially for Linux/Unix, and Windows users can remove it.

    The cod above must be placed in to a file, like for instance testStream.php.

    You must have execution rights for that file, witch can be achieved with:

    1chmod +x testStream.php
    

    Then the file can be executed in Linux directly with:

    1$./testStream.php
    

    In Windows you must give the absolute path to PHP, if the path is not already in the system include path:

    1>c:\php\php.exe testStream.php
    

    Notice that the input is with “\n” or “\r\n” at the end of the line, that’s why I’m testing “exit” with the line terminator (PHP_EOL). I’m using PHP_EOL so it can work with both Linux/Unix and Windows.

    Output

    For output there is PHP://STDOUT.

    Unlike input, the output is a lot less relevant. Basically the output is the standard one which can be achieved with echo and print.

    But for educational purpose let’s modify the previous file to use PHP://STDOUT:

     1#!/usr/bin/php
     2<?php
     3// initializing the input stream
     4$input = fopen('php://stdin', 'r');
     5
     6// initializing the output stream
     7$output = fopen('php://stdout', 'w');
     8
     9// welcome message
    10fwrite($output, 'Type "exit" and then enter to exit' . PHP_EOL);
    11// reading the steam input
    12while($line = fgets($input, 1024)) {
    13 // exit condition with line terminator
    14 if($line == 'exit' . PHP_EOL) {
    15    fwrite($output, 'bye bye' . PHP_EOL);
    16    break;
    17 }
    18 // displaying the input from the keyboard
    19 fwrite($output, 'You say: ' . $line . PHP_EOL);
    20}
    21
    22// close input stream
    23fclose($input);
    24
    25// close output stream
    26fclose($output);
    

    Basically there isn’t any change in the script, is just that the output was displayed using PHP://STDOUT explicitly.

    Error

    A more interesting subject then the output is the error stream.

    Basically is more relevant in the Unix/Linux environment, probably is relevant in Windows too but I don’t know how to capture it. If your reading this blog and you know how to do this please leave a comment below.

    And again let’s change the script so that error messages will use the proper stream. I’ll output an error each time the user enters more then 5 characters (I’m sorry but I don’t have a lot of ideas right now):

     1#!/usr/bin/php
     2<?php
     3// initializing the input stream
     4$input = fopen('php://stdin', 'r');
     5
     6// initializing the output stream
     7$output = fopen('php://stdout', 'w');
     8
     9// initializing the error stream
    10$err = fopen('php://stderr', 'w');
    11
    12// welcome message
    13fwrite($output, 'Type "exit" and then enter to exit' . PHP_EOL);
    14
    15// reading the steam input
    16while($line = fgets($input, 1024)) {
    17 // exit condition with line terminator
    18 if($line == 'exit' . PHP_EOL) {
    19    fwrite($output, 'bye bye' . PHP_EOL);
    20    break;
    21 }
    22
    23 if(strlen($line) > 5) {
    24    fwrite($err, 'WARNING! Input greater then 5 characters: ' . $line);
    25    continue;
    26 }
    27
    28 // displaying the input from the keyboard
    29 fwrite($output, 'Ai scris: ' . $line . PHP_EOL);
    30}
    31
    32// close input stream
    33fclose($input);
    34
    35// close output stream
    36fclose($output);
    37
    38// close error stream
    39fclose($err);
    

    By default in Linux error messages are displayed to the screen, but there are scenarios when the errors are redirected for instance to a log file .

    To redirect the error messages to a log file 2>> is used like in the following example:

    1$./testStream 2>>testStream.log
    

    Input from PIPE (|)

    Let’s take the fallowing scenario: the output of a previous operation contains a serious of email addresses that are both valid and invalid. There should be two files: valid.txt with valid addresses and invalid.txt with invalid ones. The email addresses will be send to the script using pipe.

    The list of email addresses will be simulated using a file called email.txt:

    1valid_addres@yahoo.com
    2another_valid@yahoo.co.uk
    3invalid@y.c
    4good@gmail.com
    5invalid addres@hotmail.com
    6foo
    

    The name of the script will be emailTest.php:

     1#!/usr/bin/php
     2<?php
     3// initializing the input stream
     4$input = fopen('php://stdin', 'r');
     5
     6// initializing error stream
     7$err = fopen('php://stderr', 'w');
     8
     9// unlike the previous cases, here is tested for the end of the file
    10// because the input is not coming from keyboard
    11while(!feof($input)) {
    12 // the value is trimmed to remove line terminators
    13 $line = trim(fgets($input, 1024));
    14
    15 // test email address
    16 if(filter_var($line, FILTER_VALIDATE_EMAIL)) {
    17    // direct output, equivalent to php://stdout stream
    18    echo $line . PHP_EOL;
    19 } else {
    20    // invalid addresses are redirected to the php://stderr stream
    21    // to be intercepted later
    22    fputs($err, $line . PHP_EOL);
    23 }
    24}
    25
    26// close input stream
    27fclose($input);
    28
    29// close error stream
    30fclose($err);
    

    For testing I’ll simulate the output of email addresses with the cat command:

    1cat email.txt |./emailTest.php >valid.txt 2>invalid.txt
    

    Now the files valid.txt and invalid.txt from the current directory contain the proper values.

    Processing like this is very useful for complex operations. Basically is an alternative to Shell Scripting (linux) or Batch Scripting (windows), which are not as flexible.

    Script arguments

    Often is useful to send direct arguments to a script to have, for instance, a different functionality.

    Let’s change the previous scenario to receive the name of the file that contains the email address, as a script argument.

    The script arguments are automatically stored in the $argv variable. Notice the first element of the array ($argv[0]) is the name of the script!

    The modified example is as follows:

     1#!/usr/bin/php
     2<?php
     3
     4// the count stars at 1 to eliminate the name of the script
     5for ($i = 1; $i < count($argv); $i++) {
     6  // initializing the input stream
     7  $input = fopen($argv[$i], 'r');
     8
     9  // initializing error stream
    10  $err = fopen('php://stderr', 'w');
    11
    12  if(!$input) {
    13   continue;
    14  }
    15
    16  // unlike the previous cases, here is tested for the end of the file
    17  // because the input is not coming from keyboard
    18  while(!feof($input)) {
    19   // the value is trimmed to remove line terminators
    20   $line = trim(fgets($input, 1024));
    21
    22   // test email address
    23   if(filter_var($line, FILTER_VALIDATE_EMAIL)) {
    24     // direct output, equivalent to php://stdout stream
    25     echo $line . PHP_EOL;
    26   } else {
    27     // invalid addresses are redirected to the php://stderr stream
    28     // to be intercepted later
    29     fputs($err, $line . PHP_EOL);
    30   }
    31  }
    32
    33  // close input stream
    34  fclose($input);
    35
    36  // close error stream
    37  fclose($err);
    38}
    

    Now just run the script with arguments:

    1$./argTest.php email.txt >valid.txt 2>invalid.txt
    
  • 100+ PHP ZCE certified developers in Romania

    Citește postarea în română

    Feb 25, 2011 certificare certification PHP zce
    Share on:

    In 2008 when I had my first certification exam there were 22 Zend Certified Engineers in Romania, I was number 23.

    With time looks like more people took the exam, and this week the number of 100 Zend Certified Engineers was exceeded!

    After a search of PHP ZCE, full of joy, I find that the 100th certified web developer in Romania is actually my colleague and friend Emanuel Croitoru,  whom I’ve tortured for weeks on end with: “don’t worry, is easy”.

    When the time came to really study the manual it didn’t look that simple. 🙂

    But after all, the determination to make this step is just another reason that a ZCE is trying to become a good web developer!

  • My php elephant (elephpant)

    Citește postarea în română

    Jan 15, 2011 elephpant php elephant
    Share on:

    Ever since I’ve learned about the existence of the elephpant, I’ve wanted one. A goal not exactly romantic or worthy of being idealistic, but a lot more complicated than it looks.

    elephpant

    Not even google can give very relevant results. The french company Nexen which is producing them don’t have any retail shops, in fact there isn’t any official retail market for them.

    Although the Web is full of photos of the php elephant from all sorts of events, or even erotic ones, not the same thing can be said about places to buy if from.

    The Nexus site states that there is a minimum of 50 small php elephants or 1 large, but here is where the story ends. At some point I decided to try to buy 50 elephant but… I was unable to do that either.

    Eventually, after about 2 years of searching I’ve got by chance on eBay. I’ve thought that maybe a second hand one exists. It seems that there is somebody in US that is distributing! When I’m writing this blog it seems that not even that announcement exists, but with a little luck in few weeks will resurface. The search has to be on “php elephant” not “elephpant” which is the official name.

    After about a couple of weeks since placing the order, it arrived! Now I’m the happy owner of an elephpant! The price is not exactly small, 15 pounds + delivery, but for this long awaited mascot I think it worth it.

    It’s really quite small, but very nicely done, and very cute. He was my mascot from the ZCE 5.3 certification.

    The mystery about the rarity of these elephants had an answer on elephpant.com: “No retail at the moment. We prefer relying on local PUG or online shop to actually do retail.”. It looks like at the moment the only way to get one is to find someone that bought 50 php elephants and now is selling some of them, or to buy 50 yourself!

    The fate of the 2011 elephpants production it was decided at the end of last year, with a pre-order form on http://www.elephpant.com/. And most likely pre-orders will be soon available again.

    When the pre-order form appeared on elephpant.com I even got a email telling me to pre-order if I’m still interested. So if you are interested you should subscribe to the newsletter.

    With this generation a new pink php elephant is on his way! Probably they are here for the PHP Woman side of the community. There aren’t any images with this new elephant, because this is the first generation.

  • Passing Zend PHP5.3 Certified Engineer Exam

    Citește postarea în română

    Jan 8, 2011 certificare certification certified php5.3 zce ZCE5.3 zend
    Share on:

    As I was saying in a previous blog, when Zend launched the new ZCE 5.3 certification I’ve received an discount voucher code, available until the end of year 2010. I wanted to use this opportunity, so in the last week of the year I’ve bought the voucher.

    I already had the experience of the ZCE 5 certification, about which I’ve blogged at that time.

    I wanted to take the exam before the end of the vacation, that is 7-I.

    The period was a little short, in theory, I had about two weeks to prepare, but because they ware around the hollydays the time was in fact way shorter.

    Zend PHP5 Certification Study Guide – 2nd Edition

    I’ve begin my study with Zend PHP5 Certification Study Guide – 2nd Edition. The book even though it does not have the latest 5.3 features is not outdated. Because it wasn’t the first time I was reading it, it felt more like a recap. I’ve tried for each chapter to create an example that will show the functionality and one that shows the cases where the functionality was not as expected. With all this in 4 days I was able to go through the entire book.

    As a suggestion, for streams and SPL for instance where is a little difficult to study directly form the manual, the guide looks like a good start.

    Because after all the book is a guide, as I was reading the book, I’ve looked in the corresponding chapters in the php.net manual for a more detailed view on the subjects.

    Mock tests

    Before I finished reading the first book I’ve took a PHP5 mock test and to my surprise the result was “Excellent”. I got the mock tests from when I took the ZCE 5 exam, and because a lot of the questions are repeat quite frequently, I’ve only used 3 back then. This time I’ve only took a couple of them for the same reason. The tests are quite useful for the PHP5 part because, just like there ware described, they are usual more complicated then the exam itself. But don’t take to many of them, especially if the first results are poor, because they may lead you in a false self trust because of the repetitive questions.

    Zend PHP 5.3 Study Guide

    When I’ve finished reading the first book I started reading the free Zend PHP 5.3 Study Guide, which can be downloaded from the certification page, in the right. The guide is in beta version and you can really feel that. Everyone who’s been talking (blogging) about it is saying that it is full of bugs, and after all that is true. One of the funniest bugs in my opinion is at page 109, question 12, the answer is D… which is not displayed in the page. But I believe that where there are bugs they will be easily discovered and will not mislead.

    It feels a lot more like a guide then the previous book, is a lot more concise and abstract and if forces you to study the manual.

    At the end of each chapter there are questions, I only had 100% on a couple of chapters. The questions a quite difficult, even more difficult then the questions in the actual exam in my opinion. You have to read each question carefully because in the exam there are the same type of questions.

    To go through the entire guide it took me another couple of days because I was already warmed up from the precedent book.

    The day before the exam

    I’ve read on Lorna “lornajane” Mitchell‘s blog that before the exam is good to recap some delicate subjects. In the day before the test I’ve started to recap some subjects that need more memory then intellect, like the tens of functions for string si array manipulation. Also I think is a good idea to recap SPL.

    The exam it self

    After not a lot of studding the moment of the exam was here.

    Just like the last time, I’ve schedule my exam over the Internet a day before and just went to the Pearson VUE center.

    The exam itself didn’t feel more difficult then the PHP 5 one. In my opinion there is more focus on high level OOP and SPL then the previous exam. The style of the questions is quite similar, maybe a little more “type in” questions, but that can be just my luck because the questions are dynamically selected from a question pool with different difficulty levels.

    The 90 minutes time has quite enough to go through all the questions whit all the attention required and to review the answers I wasn’t sure about. At the ZCE5 exam I’ve finished about a half of hour before the time. This time for ZCE 5.3 I’ve finished only 10 minutes early because I’ve tried not to rush at all.

    READ CAREFULLY! Is very important to read each question carefully and read in again until you are sure you understand what is required of you. Some questions have a quite awkward formulation and can mislead very easy. Don’t panic, if you have doubts maybe you should mark the question for review and come back to it in the end.

    I usually mark the first question of the exam for review because I’m nervous and I can’t focus enough.

    Unlike 2 years ago, when I was working a lot more with raw PHP and even had some PHP 4 servers, last year I’ve worked most of the time with open-source frameworks. This can be a disadvantage because I’ve didn’t use just as much the core functions. But unlike the first certification I must admit I didn’t study as much, probably is because of experience and the fact that occasionally I flick through the pages of the guide.

    And with that being said it is time to put the first check on the year resolution and add a new logo to my blog.

    For those who are preparing, I wish you the best of luck!

    • ««
    • «
    • 4
    • 5
    • 6
    • 7
    • 8
    • »
    • »»

Claudiu Perșoiu

Programming, technology and more
Read More

Recent Posts

  • Is PHP dead in 2026?
  • 30 years of PHP
  • HTTPS certificate monitoring in Home Assistant
  • Adding a slider to Tasmota using BerryScript
  • The future proof project
  • Docker inside wsl2
  • Moving away from Wordpress
  • Custom path for Composer cache

PHP 51 MISCELLANEOUS 47 JAVASCRIPT 14 MAGENTO 7 MYSQL 7 BROWSERS 6 DESIGN PATTERNS 5 HOME AUTOMATION 3 LINUX-UNIX 2 WEB STUFF 2 GO 1

PHP 37 JAVASCRIPT 15 PHP5.3 11 MAGENTO 7 PHP6 7 MYSQL 6 PHP5.4 6 ZCE 6 CERTIFICARE 5 CERTIFICATION 5 CLOSURES 4 DESIGN PATTERNS 4 HACK 4 ANDROID 3
All tags
3D1 ADOBE AIR2 ANDROID3 ANGULAR1 ANONYMOUS FUNCTIONS3 BERRYSCRIPT1 BOOK1 BROWSER2 CARTE1 CERTIFICARE5 CERTIFICATION5 CERTIFIED1 CERTIFIED DEVELOPER1 CHALLENGE1 CHM1 CLASS1 CLI2 CLOSURES4 CODE QUALITY1 CODEIGNITER3 COFFEESCRIPT1 COLLECTIONS1 COMPOSER1 CSS1 DEBUG1 DESIGN PATTERNS4 DEVELOPER1 DEVELOPMENT TIME1 DOCKER2 DOCKER-COMPOSE1 DOUGLAS CROCKFORD2 ELEPHPANT2 FACEBOOK2 FFI1 FINALLY1 FIREFOX3 GAMES1 GENERATOR1 GO1 GOOGLE1 GOOGLE CHROME1 GOOGLE MAPS1 HACK4 HOMEASSISTANT3 HTML2 HTML HELP WORKSHOP1 HTML51 HUG1 HUGO1 INFORMATION_SCHEMA1 INI1 INTERNET EXPLORER3 IPV41 IPV61 ITERATOR2 JAVASCRIPT15 JQUERY1 LAMBDA1 LINUX1 MAGENTO7 MAGENTO22 MAP1 MINESWEEPER1 MOTIVATION1 MYSQL6 NGINX1 NODE.JS2 NOSQL1 OBSERVER3 OBSERVER PATTERN1 OOP1 OPERA1 OPTIMIZATION1 ORACLE1 PAGESPEED1 PAIR1 PARSE_INI_FILE1 PHONEGAP2 PHP37 PHP ELEPHANT2 PHP FOR ANDROID1 PHP-GTK1 PHP42 PHP53 PHP5.311 PHP5.46 PHP5.53 PHP5.61 PHP67 PHP7.41 PROGRAMMING1 REVIEW1 ROMANIAN STEMMER2 SAFARY1 SCALAR TYPE HINTING1 SCHEME1 SET1 SHOPPING CART PRICE RULE1 SINGLETON1 SOAP1 SPL2 SQLITE1 SSH1 STACK TRACE1 STDERR1 STDIN1 STDOUT1 SUN1 SYMFONY2 TASMOTA1 TEST TO SPEECH1 TITANIUM2 TRAITS1 TTS1 UBUNTU1 UNICODE2 UTF-82 VECTOR1 WEBKIT1 WINBINDER1 WINDOWS2 WORDPRESS1 WSL21 YAHOO3 YAHOO MAPS1 YAHOO OPEN HACK1 YSLOW1 YUI1 ZCE6 ZCE5.31 ZEND3 ZEND FRAMEWORK3
[A~Z][0~9]

Copyright © 2008 - 2026 CLAUDIU PERȘOIU'S BLOG. All Rights Reserved