Переменная php возвращается к последней назначенной после интенсивной операции завивки

Я запрашиваю один api и отправляю данные другому. Я также запрашиваю базу данных mysql. И проделывая все это примерно 40 раз за одну секунду. Затем подождите минуту и ​​повторите. У меня такое чувство, что я нахожусь на пределе возможностей PHP.

Мой вопрос касается двух переменных, которые случайным образом вернутся к своему последнему значению из предыдущего цикла. Они изменяют свое значение только после вызова self :: apiCall () (ниже во второй функции). И $ product, и $ productId изменяют свое значение случайным образом примерно раз в 40 циклов или около того.

Я увеличил PHP до 7.2, увеличил объем памяти до 512 и присвоил некоторым переменным значение NULL для экономии памяти. Я не получаю никаких официальных предупреждений о памяти, но наблюдать, как переменные случайным образом возвращаются к своему последнему значению, вызывает недоумение. Вот как выглядит код.

/**
* The initial create products loop which calls the secondary function where
* the variables can change.
**/
public static function createProducts() {
    // Create connection
    $conn = new mysqli(SERVERNAME, USERNAME, PASSWORD, DBNAME, PORT);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // This will go through each row and echo the id column
    $productResults = mysqli_query($conn, "SELECT * FROM product_creation_queue");
    if(mysqli_num_rows($productResults) > 0) {
        $rowIndex = 0;
        while($row = mysqli_fetch_assoc($productResults)){
            self::createProduct($conn, $product);
        }
    }

}

/**
* The second function where I see both $product and $productId changing
* from time to time, which completely breaks the code. Their values
* only change after the call to self::createProduct() which is simply a 
* curl function to hit an api endpoint.
**/
public static function createProduct($mysqlConnection, $product) {

    // convert back to array from json
    $productArray = json_decode($product, TRUE);

    // here the value of $productId is one thing
    $productId = $productArray['product']['id'];

    // here is the curl call
    $addProduct = self::api_call(TOKEN, SHOP, ENDPOINT, $product, 'POST');

    // and randomly here it can revert to it's last value in a previous loop
    echo $productId;

}
0
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в том, что вся процедура из 40 запросов занимала больше одной минуты. И задание cron, которое запускало процедуру в минуту, запускало следующую процедуру до того, как завершилось первое, тем самым каким-то образом переназначая переменные на лету. Запросы обычно занимали менее одной минуты, но когда они длились дольше, возникали конфликты, что приводило к появлению случайности.

Я уменьшил количество запросов в минуту, поэтому теперь процесс завершается менее чем за 60 секунд, и никакие переменные никогда не перезаписываются. Я до сих пор не понимаю, как изменятся переменные, если одновременно будут выполняться два процесса php - похоже, они будут разрознены.

Другие вопросы по теме