shell_exe c возвращает NULL, но работает в оболочке - PullRequest
1 голос
/ 03 марта 2020

В моем сценарии php я вызываю другой php scipt через shell_exec().

( Второй сценарий работает только при выполнении в оболочке, я не знаю почему но это не должно иметь значения. )

Это основной скрипт, вызывающий другой:

  $result = shell_exec( 'php /html/wp-content/plugins/neuhof/includes/sync/load_products.php' );
  $data = json_decode($result, true);

    foreach($data as $product) {
        if($product['ID'] !== NULL) {
            $wc_product = wc_get_product( $product['ID'] );
            ?>
                <tr id="<?php echo $product['Xhartid']; ?>">
                    <td class="title column-title has-row-actions column-primary page-title"><strong><?php echo $wc_product->get_name(); ?></strong>
                        <div class="row-actions">ID: <?php echo $product['ID']; ?> | <span class="view"> <a href="<?php echo get_permalink( $product['ID'] ); ?>" target="_blank"> Anschauen </a> </span></div>
                    </td>
                    <td><?php echo $product['operation']; ?></td>
                    <td class="state">Warten auf WP-Cron...</td>
                </tr>
            <?php
        } else {
            ?>
                <tr id="<?php echo $product['Xhartid']; ?>">
                    <td class="title column-title has-row-actions column-primary page-title"><strong><?php echo $product['Xhartbez']; ?></strong>
                        <div class="row-actions">Noch keine ID vergeben</div>
                    </td>
                    <td><?php echo $product['operation']; ?></td>
                    <td class="state">Warten auf WP-Cron...</td>
                </tr>
            <?php

        }
    }

Это скрипт, который должен выполняться в оболочке:

<?php
ini_set('display_errors', 0);
require_once( 'databases.php' );        // Notwendige Datenbankverbindungen
define('SHORTINIT', true);              // load minimal WordPress
require_once '/html/wp-load.php';       // WordPress loader

// Mit dieser Funktion werden die Datenbank IDs aus dem ERP nutzbar gemacht
function decodeID($id) {
    $unpacked = unpack('Va/v2b/n2c/Nd', $id);
    return sprintf('%08X-%04X-%04X-%04X-%04X%08X', $unpacked['a'], $unpacked['b1'], $unpacked['b2'], $unpacked['c1'], $unpacked['c2'], $unpacked['d']);
}

$sql = "
    SELECT
    Xhartid,
    Xbearbdat,
    Xhartbez
    FROM cms.dbo.xHauptartikel
    WHERE Xinternet = '1'
    ORDER BY Xhartid ASC
";

$erp_ids = $GLOBALS['erp']->query($sql)->fetchALL();

// Code für Abfrage mit WordPress ID
$sql = "
    SELECT distinct
    A.post_id as 'ID',
    A.meta_value as 'Xhartid',
    B.meta_value as 'Xbearbdat'
    FROM
    wp_postmeta A,
    wp_postmeta B
    WHERE
    A.meta_key = 'Xhartid'
    AND
    B.meta_key = 'Xbearbdat'
    AND
    A.post_id = B.post_id
    order by Xbearbdat
    asc
";
$b = $GLOBALS['cms']->query($sql)->fetchALL();

foreach( $erp_ids as $keya => $a ) {
    foreach( $b as $key => $row ) {
        if(decodeID($a['Xhartid']) == $row['Xhartid'] ) {
            if($a['Xbearbdat'] == $row['Xbearbdat']) {
                // Ist akutell
            } else {
                // Aktualisieren
                $list[decodeID($a['Xhartid'])]['operation'] = 'Aktualisieren';
                $list[decodeID($a['Xhartid'])]['ID'] = $row['ID'];
                $list[decodeID($a['Xhartid'])]['Xhartid'] = $row['Xhartid'];
            }
            unset($b[$key]);
            unset($erp_ids[$keya]);
        }
    }
}

// Erstellen
foreach($erp_ids as $row) {
    $list[decodeID($row['Xhartid'])]['operation'] = 'Erstellen';
    $list[decodeID($row['Xhartid'])]['ID'] = NULL;
    $list[decodeID($row['Xhartid'])]['Xhartid'] = decodeID($row['Xhartid']);
    $list[decodeID($row['Xhartid'])]['Xhartbez'] = $row['Xhartbez'];
}

// Löschen
foreach($b as $row) {
    $list[$row['Xhartid']]['operation'] = 'Löschen';
    $list[$row['Xhartid']]['ID'] = $row['ID'];
    $list[$row['Xhartid']]['Xhartid'] = $row['Xhartid'];
}

if($argv[1] == 'count') {
    $ids = 0;
    foreach( $list as $product ) {
        $ids++;
    }
    echo $ids;
} elseif ($argv[1] == 'list') {
    $ids = NULL;
    foreach( $list as $product ) {
        $ids[] = $product['Xhartid'];
    }
    echo json_encode($ids, JSON_UNESCAPED_UNICODE);
} else {
    echo json_encode($list, JSON_UNESCAPED_UNICODE);
}

Сценарий возвращает NULL, и даже если я попытаюсь exec() и получу ошибки, они также NULL.

Я понятия не имею, почему это не работает, так как shell_exec('ls') и простые сценарии "hello world" работают отлично!

1 Ответ

1 голос
/ 03 марта 2020

(Второй скрипт работает только при выполнении в оболочке, я не знаю почему, но это не должно иметь значения.)

Это, вероятно, потому что соединение MS SQL из второго сценария, который вы упомянули, заблокирован в вашей среде веб-сервера / php конфигурация, используемая веб-сервером.

Когда вы запускаете второй сценарий из оболочки, он может нормально работать, так как он работает в другой среде. Но когда вы запускаете второй скрипт, используя shell_exe c в скрипте php, запущенном вашим веб-сервером, он запускается в той же среде веб-сервера, где он был заблокирован.

Так что, если вы пытаетесь использовать shell_exe c как «взлом» для того, чтобы пропустить ограничения в среде вашего веб-сервера, тогда он не будет работать.

Вы должны обратиться к администратору сервера, чтобы решить эту проблему.

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