Programmable Voice Quickstart for PHP

With just a few lines of code, your PHP web application can make and receive phone calls with Twilio Programmable Voice.

This PHP Voice quickstart will teach you to do this using Twilio's Voice REST API, the Twilio PHP helper library, the built-in PHP development web server, and ngrok to expose your local server to Twilio.

In this quickstart, you will learn how to:

  1. Sign up for Twilio and get your first voice-enabled Twilio phone number
  2. Check and install any PHP prerequisites
  3. Make an outbound phone call and play an MP3
  4. Receive and respond to an inbound phone call to read a message to a caller using Text to Speech

Prefer to get started by watching a video? Check out our video on how to place and receive phone calls with PHP.

Already have a Twilio account and a voice-enabled Twilio phone number? Log in then jump to the next step.

Before you can make a phone call from PHP, you first need a Twilio account. Sign up here for a free trial account.

If you already have an account, log in now.

Next, you'll need a voice-capable Twilio phone number. If you don't own a Twilio phone number with voice capabilities, you need to purchase one now. Navigate to the Buy a Number page, check "Voice" under capabilities, then click the red "Search" button.

Search for a voice-enabled phone number

Next, you'll see a list of available phone numbers and capabilities. Pick your favorite then click the "Buy" button to add it to your account.

Purchase a voice-enabled phone number from Twilio

Now that you have a Twilio account and a voice-capable phone number you have what you need to make a phone call.

Instead of using Twilio's Voice API directly to make phone calls, we're going to save time by using the Twilio PHP Helper Library. Let's install that next.

If you already have PHP and the Twilio PHP Helper Library installed in your working directory, you're all set for this step. Feel free to skip ahead and move on to sending your first text message.

To make your first outbound voice call, let's make sure you're set up with PHP and able to install Twilio's PHP Helper library.

When doing web development in PHP, we strongly suggest using Composer for your package management. This quickstart relies on Composer to install the PHP Helper library. (If you choose not to use Composer, you can find manual Twilio PHP installation instructions on the PHP Helper Library page.)

Install PHP

If you’re using a Mac or *nix machine, you may already have PHP installed. In your terminal, run:

php --version

If PHP is not installed, follow the PHP installation instructions.

If you're using a Windows machine, follow the official PHP tutorial to install PHP.

While many versions of PHP 5.x and PHP 7.x will work for this quickstart, please pay attention to supported PHP releases. When doing web development, always update your PHP version to a release which receives security updates.

Install Composer for package management

Composer is the de facto canonical package manager for PHP web development. For this tutorial, we strongly suggest installing Composer. It will be very useful for your other web development as well.

Install the Twilio PHP Helper Library

Now we need to install the Twilio PHP Helper Library. 

If you are using Composer, there are two ways to do this. First, navigate to the directory where you will complete this quickstart then choose one of the following methods to install the helper library.

From a terminal, you can run the following command:

composer require twilio/sdk

Or, you can create a file named composer.json instead. In that file, add:

{
    "require": {
        "twilio/sdk": "^5.0"
    }
}

Next, run

composer install

Composer will grab the latest 5.x version of the Twilio PHP Helper Library.

For a non-composer installation follow the instructions here. That page has instructions on how to change the code samples here to match your manual install.

Make an outgoing phone call with PHP

Now that we have PHP and the PHP Helper Library installed, we can make an outgoing phone call in a single API request. Create a new file called make_call.php and type or paste in this code sample.

Loading Code Samples...
Language
SDK Version:
  • 5.x
<?php
require __DIR__ . '/vendor/autoload.php';
use Twilio\Rest\Client;

// Your Account SID and Auth Token from twilio.com/console
$account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$auth_token = 'your_auth_token';
// In production, these should be environment variables. E.g.:
// $auth_token = $_ENV["TWILIO_ACCOUNT_SID"]

// A Twilio number you own with SMS capabilities
$twilio_number = "+15017122661";

// Where to make a voice call (your cell phone?)
$to_number = "+15558675310";

$client = new Client($account_sid, $auth_token);
$client->account->calls->create(  
    $to_number,
    $twilio_number,
    array(
        "url" => "http://demo.twilio.com/docs/voice.xml"
    )
);
Make a Voice call with the PHP Helper Library
Make a voice call

Make a Voice call with the PHP Helper Library

When you run the code, it will start a phone call between the two numbers passed as arguments. We've added two variables to show you the 'From' and 'To' number and they will map like this:

  • (From) / twilio_number: The Twilio phone number you purchased
  • (To) / to_number: The number to call (perhaps your cell phone?)

Inside the array, the url argument points to some TwiML. TwiML is a language Twilio uses internally to initiate or respond to actions, such as a sequence for a voice call. This particular TwiML causes Twilio to read a message with text to speech then play an MP3 to the 'To' / to_number number.

Before you can run this code, you need to swap in a couple of account specific values.

Replace the placeholder credentials with your own

Substitute the placeholder values for account_sid and auth_token with your Twilio account credentials.

To find these, visit https://www.twilio.com/console and log in. On this page, you’ll find your unique Account SID and Auth Token. You can reveal the Auth Token by clicking the 'eye' icon:

Reveal Your Auth Token

Open make_call.php and replace the values for account_sid and auth_token with your unique values.

Note: It's easier to hardcode your credentials for this quickstart, but you should use environment variables to keep them secret in production. Check out how to set environment variables for more information, and see the code comments for a reading example. This repo is also an excellent reference for environment variables in PHP.

Replace the twilio_number phone number

Earlier, you purchased or found a voice-enabled phone number. Paste the number into the twilio_number variable using E.164 formatting:

[+][country code][phone number including area code]

For example, +18005551212.

Replace the to_number phone number

Again using E.164 formatting, substitute the phone number which will receive the outgoing call. You should use a personal phone number here so you'll receive the call and hear the magic after running the code.

If you're using a Twilio trial account, you can only make outgoing calls to phone numbers you have verified with Twilio. Phone numbers can be verified with your Twilio Console's Verified Caller IDs. For full trial account limitations, see our guide on how to work with your free Twilio trial account.

Save the script and invoke it to test an outgoing call. For OSX and *NIX, this should look like:

php make_call.php

If you substituted everything correctly, you'll soon hear a great message and a brand new song! If not, don't ever give up and follow the console prompts.

Receive and respond to inbound voice calls with PHP

When someone calls your Twilio phone number, Twilio makes an HTTP request to your server asking for instructions on how to handle the call. For this quickstart, we’ll reply to the sender and thank them for their phone call using Twilio's text to speech capabilities.

Again, we'll use the Twilio PHP Library for this step. We will use PHP's built-in development webserver in combination with ngrok to instruct Twilio on how to manage the call.

Create a new file, answer_call.php, in the same directory as make_call.php. Then copy and paste or type the following code.

(Note: if you do not use the same directory as you did when we made our first call, please follow the PHP Helper Library install step above)

Loading Code Samples...
Language
SDK Version:
  • 5.x
<?php
require __DIR__ . '/vendor/autoload.php';
use Twilio\Twiml;

// Start our TwiML response
$response = new Twiml;

// Read a message aloud to the caller
$response->say(
    "Thank you for calling! Have a great day.", 
    array("voice" => "alice")
);

echo $response;
Receive and respond a Voice call with the PHP Helper Library
Receive an incoming voice call

Receive and respond a Voice call with the PHP Helper Library

Save answer_call.php, then start a local PHP development server with:

php -S localhost:8000

In a browser tab open the URL http://localhost:8000/answer_call.php.

If everything went well, you should now see XML in your browser with the message we'd like to read to incoming calls. That's all the code you need - there are just a few more steps before everything is wired up.

Next, let's expose this endpoint to Twilio.

Allow Twilio to talk to your PHP application

Before we can instruct Twilio on what to do in response to an incoming call, you first need to expose your server to the public. When you run your local development server, the odds are very high it is only accessible from your local network. But don't worry - we'll show you an easy way to test your server.

Many Twilio products and services use webhooks to communicate with your application. For example, when Twilio receives an incoming call, it reaches out to a specific URL you provide to search for instructions on how to handle the response. The small piece of code in answer_call.php is an example of one instruction you can use to 'speak' back to the caller. However, when you run the server it will only be exposed to you locally, not to the broader public. We need to figure out a way to fix that.

While there are many ways to make this code public (for example by deploying it to a host), we recommend a tool called ngrok. When you start ngrok, it provides a unique URL on the ngrok.io domain and forwards incoming requests to your local development environment.

The architecture looks like this:

How ngrok helps Twilio reach your local server

If you don’t already use ngrok, visit the download page and install it for your operating system.

If you're working on Mac or Linux, you're all set after you decompress it. If you're on Windows, follow our guide on how to install and configure ngrok on Windows. For more info on ngrok (including some great tips and tricks) check out our this ngrok blog post.

Once you download an install ngrok, open a new terminal tab or window (leaving your development server running) and start it with this command:

./ngrok http 8000

You should see output similar to this:

Ngrok server terminal output

Copy the public URL from this output, paste it into your browser, and append answer_call.php. You should see the same XML you saw previously, except now you can access this from anywhere you've got internet access.

Now that you're public let's tell Twilio where to find the server.

Configure your webhook URL

Now that your server is publically accessible, you need to configure your Twilio phone number to access your webhook URL when new calls come in.

  1. Visit the Console's Numbers page.
  2. Click on your voice-enabled phone number.
  3. Find the "Voice & Fax" section. Make sure the "Accept Incoming" selection is set to "Voice Calls." The default "Configure With" selection is what you’ll need: "Webhooks/TwiML...".
  4. In the "A Call Comes In" section, select "Webhook" and paste in the URL you want to use, appending /answer_call.php :

Voice call webhook with ngrok

Save your changes, and you're ready to roll!

Test your application

If your local development server is still running and ngrok is still going, you're ready for the fun part - testing!

Make a phone call to your Twilio phone number. You'll see and hear a number of things happen in short succession:

  1. You'll see an HTTP request in the ngrok console
  2. The development server will print out some messages to the console
  3. You'll hear the message once the call connects

And there you go - working outbound and inbound calling with PHP.

Where to next?

Now you know the basics of making and responding to phone calls with PHP.

This PHP app only used the <Say> TwiML verb to read a message to the caller using text to speech. With different TwiML verbs, you can create other powerful constructs and call flows. Try a few, such as <Record>, <Gather>, and <Conference>.

Check out these pages to learn more:

We can't wait to see what you build!

Need some help?

We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd browsing the Twilio tag on Stack Overflow.

Loading Code Samples...
SDK Version:
  • 5.x
<?php
require __DIR__ . '/vendor/autoload.php';
use Twilio\Rest\Client;

// Your Account SID and Auth Token from twilio.com/console
$account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$auth_token = 'your_auth_token';
// In production, these should be environment variables. E.g.:
// $auth_token = $_ENV["TWILIO_ACCOUNT_SID"]

// A Twilio number you own with SMS capabilities
$twilio_number = "+15017122661";

// Where to make a voice call (your cell phone?)
$to_number = "+15558675310";

$client = new Client($account_sid, $auth_token);
$client->account->calls->create(  
    $to_number,
    $twilio_number,
    array(
        "url" => "http://demo.twilio.com/docs/voice.xml"
    )
);
SDK Version:
  • 5.x
<?php
require __DIR__ . '/vendor/autoload.php';
use Twilio\Twiml;

// Start our TwiML response
$response = new Twiml;

// Read a message aloud to the caller
$response->say(
    "Thank you for calling! Have a great day.", 
    array("voice" => "alice")
);

echo $response;