[Asterisk-Users] AGI and PHP

WipeOut wipe_out at onetel.com
Tue Nov 11 00:46:44 MST 2003


Thanks for that ..

I have also just started writing a AGI in PHP and have also discovered 
some of the issues.. you have shown me a few more that I probably would 
have bumped into.. Should save me a little stress.. :)

Later..

hkirrc.patrick wrote:

> i've just spent the pass 2 days trying to get AGI to work with PHP;
>
> i made a lot of silly mistakes along the way which could have been
> avoided if only there were some kinda howto or samples.  at the risk
> of looking stupid, i decided to shared my experience in hopes that
> it might help some newbie get going with PHP.
>
> 1. first order of business is to be aware of your php environment; i m
>   NOT saying you should change anything but you should be aware
>   of it as it may spare you some frustration along the way especially
>   when you are in the thick of things.  look in your php config file
>   (usually in  /etc/php.ini) for the following:
>
>    ob_implicit_flush(false);
>    set_time_limit(5);
>    ; error_log = filename
>
>   the first item shows whether php should buffer output; in the case
>   of * agi, if you buffer your output, * will not get your instruction 
> for a
>   long time unless you flush the buffer manually (see below)
>
>   the second item is the max. allowable time to run your php script.  
> most
>   * agi script will run within a reasonable time but if you have a very
>   lengthy script that is producing strange errors, it is possible that 
> your
>   script was terminated prematurely.
>
>   the third item is Log; great for debug but a killer for production 
> system.
>   it might have been turned off by default or you may have turn it off
>   on purpose and don't remember.
>
> 2. put your scripts in the following directory and get it working first
>   before you do anything fancy
>
>    /var/lib/asterisk/agi-bin/
>
> 3. remember to chmod ALL your script to 755 as follows:
>
>   chmod 755 *.php
>
> 4. the very first 2 lines in your script should be as follows:   
> (assuming that your php bindery is in /usr/bin; double check now)
>
>   #!/usr/bin/php -q
>   <?php
>
>   notice: there are no gaps and no white space char (except a single \n)
>   between lines 1 and 2.  otherwise strange things will be sent to stdout
>   and ruin your day!
>
> 5. next, you should use fopen() to create all your needed handles.  i 
> know
>   different versions of php have varying features to deal with stdio 
> streams
>   but fopen() will work with most new and old versions making your 
> scripts
>   more portable and you don't have to fidget with the php.ini file. 
> besides,
>    fopen() does not pose any inconvenience for use with * agi, so use it.
>
>   $stdin = fopen('php://stdin', 'r');
>   $stdout = fopen('php://stdout', 'w');
>   $stdlog = fopen('my_agi.log', 'w');
>
> 6. * always sends a bunch of info each time agi is called as follows:
>
>     agi_request: test.php
>     agi_channel: Zap/1-1
>     agi_language: en
>     agi_type: Zap
>     agi_callerid:
>     agi_dnid:
>     agi_context: default
>     agi_extension: 1000
>     agi_priority: 1
>                  .
>                  .
>   if you need the info, save it; otherwise throw them away as follows:
>
>      while(($data = fgets($stdin,1024)) != "\n")
>        {
>              //   codes to save the info goes here
>              //   or do nothing
>        }
>
> 7. this is the point where you can start talking with *.  use fputs to
>   send * agi commands; some people use echo but i prefer fputs:
>
>      fputs($stdout,"SAY NUMBER 1234567 '79#' \n");
>      fflush($stdout);
>
> 7a. use fflush() regardless of php.ini setting just to be safe, does hurt
>    if you don't fflush() (auto or manual), * will not receive the command
>    and your app will be stuck there until timeout.
>
> 7b. use of quotes;
>       * agi command options are not optional
>            i.e.  they must appear on the command string
>       * some options MUST be enclosed in quotes
>            e.g. <escape digits> of SAY NUMBER and SAY DIGITS
>       * some options MUST NOT be enclosed in quotes
>            e.g. <digit string> of SAY NUMBER and SAY DIGITS
>       * some options can go either way.
>       * you can use single quote where quote is needed e.g. as above
>       * as a reminder, escape char such as \n in a strings within 
> sigle quotes
>         will not be resolved !!!!  but i'm sure you already know that.
>
> 8. next, you'll have to pick up responses from * which is pretty 
> straight forward:
>
>      $msg  = fgets($stdin,1024);
>      fputs($stdlog,$msg . "\n");
>
> 9.  if your script failed for some reason (especially if you forget to 
> fflush()), the process
>   is actually hung in limbo;  REMEMBER to killproc your script process 
> before you
>   test again:
>
>      killproc my_script.php
>
> 10. the purpose of this is to show the PHP aspects of * agi and not 
> agi in general;
>    there are many excellent documentation on * agi such as the following,
>    you should read that as well:
>
>       http://home.cogeco.ca/~camstuff/agi.html
>
> 11. sample.php
>
> #!/usr/bin/php -q
> <?php
>
> $stdin = fopen('php://stdin', 'r');
> $stdout = fopen('php://stdout', 'w');
> $stdlog = fopen('my_agi.log', 'w');
>
> while(($abc  = fgets($stdin,1024)) != "\n")
>  {
>   fputs($stdlog,$abc);
>   // or parse the data for use
>  }
>
> fputs($stdout,"ANSWER\n");
> fflush($stdout);
> $abc  = fgets($stdin,1024);
> fputs($stdlog,$abc . "\n");
>
> fputs($stdout,"GET DATA aa-welcome '1' 1\n");
> fflush($stdout);
> $abc  = fgets($stdin,1024);
> fputs($stdlog,$abc . "\n");
>
> fputs($stdout,"EXEC Meetme 1234|p \n");  // <=- notice the |p in 
> 1234|p being the option for meetme
> fflush($stdout);
> $abc  = fgets($stdin,1024);
> fputs($stdlog,$abc . "\n");
>
> exit();
>
> ?>
>
>
>
> _______________________________________________
> Asterisk-Users mailing list
> Asterisk-Users at lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-users
>





More information about the asterisk-users mailing list