PHP-интерфейс Twilio Voicemail - не будет работать на AWS EC2 или Lightsail - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь создать веб-интерфейс для проверки голосовой почты, оставленной для номеров Twilio. Я действительно озадачен на этом этапе, был бы признателен за любые намеки на то, что я пропустил. Я новичок в разработке, так что я вполне могу пропустить что-то простое. Код работает на VPS-лампе AWS.

1) index.php извлекает номера из моей учетной записи twilio с возможностью просмотра подробностей для каждого номера.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<body>
    <div class="container">
        <div class="row">
        </div>
        <hr>
        <div class="row">
            <div class="col-md-12">
                <table class="table table-bordered" id="example">
                    <thead>
                        <tr>
                            <th>Sid</th>
                            <th>Friendly Name</th>
                            <th>Phone Number</th>
                            <th>Action</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php
                        // Get the PHP helper library from https://twilio.com/docs/libraries/php
                        require_once 'vendor/autoload.php'; // Loads the library
                        use Twilio\Rest\Client;
                        include("config.php");

                        $client = new Client($__sid, $__token);


                        foreach ($client->incomingPhoneNumbers->read() as $number) {
                        ?>
                        <tr>
                            <td><?php echo $number->sid;?></td>
                            <td><?php echo $number->friendlyName;?></td>
                            <td><?php echo $number->phoneNumber;?></td>

                            <td>
                                <a href="getphn_detail.php?sid=<?php echo $number->phoneNumber;?>">
                                    <button type="button" class="btn btn-primary">Detail</button>
                                </a>
                            </td>
                        </tr>
                        <?php } ?>
                </table>
            </div>
        </div>
    </div>
</body>
</html>

<script>
    $(document).ready(function() {
        $('#example').DataTable();
    });
</script>

2) При нажатии кнопки сведений в файле getphn_detail.php должны отображаться все записи о вызовах с возможностью загрузки или удаления голосовой почты, если есть такая запись, связанная с этой записью о вызове. Я получаю ошибку 500, журнал ошибок apache показывает ошибку ниже. Строка 129 - последняя строка файла.

[Чт, 17 мая 16: 44: 07.266066 2018] [proxy_fcgi: error] [pid 2000: tid 140124901693184] [client xxxx: 54504] AH01071: получена ошибка 'Сообщение PHP: ошибка синтаксического анализа PHP: ошибка синтаксиса, неожиданное завершение файл в /opt/bitnami/apache2/htdocs/getphn_detail.php в строке 129 \ n '

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<body>
    <div class="container">
        <div class="row">
            <h1>
                Showing Details of <?=$_REQUEST["sid"]?>
                <span style="float:right"><a href="index.php">Back</a></span>
            </h1>
        </div>
        <hr>
        <div class="row">
            <div class="col-md-12">
                <table class="table table-bordered" id="example">
                    <thead>
                        <tr>
                            <th>Callid </th>
                            <th>From </th>
                            <th>To</th>
                            <th>Date</th>
                            <th>Duration</th>
                            <th>Action</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php
                        // Get the PHP helper library from https://twilio.com/docs/libraries/php
                        require_once 'vendor/autoload.php'; // Loads the library
                        use Twilio\Rest\Client;

                        include("config.php");

                        $client = new Client($__sid,$__token);

                        $phn = $_GET['sid'];
                        $calls= $client->calls->read(
                            array("to" => $phn)
                        );
                        // Loop over the list of calls and echo a property for each one
                        //print_r($calls);


                        $url="https://api.twilio.com/2010-04-01/Accounts/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Recordings.json";

                        $username="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
                        $password="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
                        $ch = curl_init();
                        curl_setopt($ch, CURLOPT_URL, $url);
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                        curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
                        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
                        $output = curl_exec($ch);
                        $info = curl_getinfo($ch);
                        curl_close($ch);


                        $data = json_decode($output, true);
                        //print_r($data);
                        $recordings =array();

                        foreach($data['recordings'] as $key1 ) {
                            $recordings[][$key1['call_sid']]=$key1['sid']."~~".$key1['duration'];
                        }




                        foreach ($calls as $call) {

                        ?>
                        <tr>
                            <td><?php echo $call->sid;?></td>
                            <td><?php echo $call->from;?></td>
                            <td><?php echo $call->to;?></td>
                            <td>
                                <?php $array = json_decode(json_encode($call->startTime), true);
                                echo date('d-m-Y',strtotime($array['date']));?>
                            </td>

                            <td><?php echo $call->duration?></td>
                            <td>
                                <?php
                                foreach($recordings as $key => $record)
                                {
                                    foreach($record as $key2 => $value)
                                    {
                                        if($key2==$call->sid)
                                        {
                                            $data1=explode("~~",$value);
                                ?>
                                <a href="https://api.twilio.com/2010-04-01/Accounts/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Recordings/<?=$data1[0]?>.mp3?Download=true"><button type="button" class="btn btn-primary">Recording (<?=$data1[1]?> Sec)</button></a>
                                <a href="deleterecord.php?id=<?=$data1[0]?>" onclick="return confirm('Are you sure you want to delete?');"><button type="button" class="btn btn-danger">Delete</button></a><BR />&nbsp;<BR />
                                <?
                                        }
                                    }

                                }
                                ?>
                        </tr>
                        <?php } ?>
                </table>
            </div>
        </div>
    </div>
</body>
</html>

<script>
    $(document).ready(function() {
        $('#example').DataTable();
    });
</script>

1 Ответ

0 голосов
/ 18 мая 2018

Просто чтобы прояснить несколько вещей для вас, чтобы вы и другие могли избежать этой проблемы в будущем:

  • У вас возникла непредвиденная синтаксическая ошибка
  • Я взял кодпод вопросом и запустил php -l filename.php Ваш файл проверен, поэтому я могу сказать, что это не пропущенный начальный или конечный блок или точка с запятой.
  • Я также отметил, что вы смешивали типы тегов, что не очень хорошая идея.,Я подозревал, что это, возможно, проблема с short_open_tag = off, однако php был изменен, поэтому тег <?= доступен даже без short_open_tag = on .Это имело место с php версии 5.4.С учетом вышесказанного мы так и не добрались до точки проверки вашей настройки short_open_tag.

Как я полагаю, вы знаете,

<?= $somevar ?>

Это эквивалент

<?php echo somevar; ?>

Я знаю, что вы использовали <?=, и это, в зависимости от версии, не должно быть проблемой с той версией php, которую вы использовали.Использование только <? является проблемой, и, похоже, именно здесь у вас возникла проблема, и анализатор был сбит с толку, но до этого момента вы использовали <?php, <? и <?=, что является причиной отсутствия согласованностив конечном итоге вызывает проблемы.

При выполнении большого количества смешивания PHP и HTML, как вы, я понимаю привлекательность <?= и поддержку его со стороны PHP.
Я также выступаю за то, что есливы решили использовать PHP для его встроенных шаблонизаторских возможностей, а затем использовать альтернативный синтаксис для управляющих структур .Существует альтернативный синтаксис if, while, for, foreach и switch.

При смешивании с html они лучше сочетаются и более удобочитаемы, окружая и перемешивая HTML, как и вы.

InНа самом деле, короткие открытые теги стали официально осуждаемыми и теперь отключены по умолчанию, но в большинстве случаев, когда у кого-то есть приложение на основе PHP, они не будут конфликтовать с чем-либо или вызывать проблемы.Я не советую идти против зерна, а просто признаю реальность.О единственной вещи, с которой short_open_tag = on вызывает проблему, является то, что если вы используете PHP для вывода XML-файла, и вы смешиваете XML с PHP, как в:

<?xml version="1.0" ?>
<? //Some php ?>

Даже при наличии простого обходного пути,но это, безусловно, крайний случай.

В общем, вы могли бы избежать этой проблемы, просто будучи последовательными в использовании тегов, и последовательность - это хороший способ улучшить общее качество вашего кода.

Мой последний совет: при использовании больших шаблонов существует ряд хорошо зарекомендовавших себя библиотек шаблонов php, которые могут помочь вам отделить логику от выходных данных.В MVC это будет отделять C (ontrol) от V (iew) в вашем случае.Шаблонные движки, на которые стоит обратить внимание: это Laravel's Blade, Symfony's Twig, Smarty и Plates.

Перемещая всю вашу разметку в файл шаблона, управляющие / логические части вашего кода будут краткими и простыми.В вашем представлении все еще есть много логики, поскольку вы выполняете циклы, но все перечисленные мной механизмы шаблонов имеют функции, которые позволяют выполнять циклы на структурах данных и предоставляют небольших помощников для манипулирования данными.

Например, здесь приведен фрагмент кода шаблона веточки, который зацикливается на массиве:

<!-- templates/homepage.twig -->
<h1>{{ pageTitle }}</h1>

<div class="row">
    {% for product in products %}
        <div class="span4">
            <h2>{{ product }}</h2>
        </div>
    {% endfor %}
</div> 

Я взял это из бесплатного урока от ребят из KNPUniversity.Принцип КНПУ - ведущий специалист по документации проекта Symfony.Если вам нравится материал, полный курс по веткам по разумной цене, но вы узнаете немало, в том числе кое-что о вышеупомянутых альтернативных структурах контроля, просто прочитав материал, приложенный к странице курса.

Помимо решенияя надеюсь, что это поможет вам с рефакторингом и улучшением вашего проекта и тех, с которыми вы столкнетесь в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...