bool detectOpcacheRestartPending()

in agent/native/ext/util_for_PHP.cpp [325:365]


bool detectOpcacheRestartPending() {
    if (!isOpcacheEnabled()) {
        return false;
    }
    if (EG(function_table) && !zend_hash_str_find_ptr(EG(function_table), ZEND_STRL("opcache_get_status"))) {
        return false;
    }

	zval rv;
    ZVAL_NULL(&rv);
	zval parameters[1];
	ZVAL_BOOL(&parameters[0], false);

	int er = EG(error_reporting); // suppress error/warning reporing
	EG(error_reporting) = 0;
    int result = call_internal_function(NULL, "opcache_get_status", parameters, 1, &rv);
	EG(error_reporting) = er;

    if (result == resultFailure) {
        ELASTIC_APM_LOG_ERROR("opcache_get_status failure");
        zval_ptr_dtor(&rv);
        return false;
    }

    if (Z_TYPE(rv) != IS_ARRAY) {
        ELASTIC_APM_LOG_DEBUG("opcache_get_status failed, rvtype: %d", Z_TYPE(rv));
        zval_ptr_dtor(&rv);
        return false;
    }

	zval *restartPending = zend_hash_str_find(Z_ARRVAL(rv), ZEND_STRL("restart_pending"));
    if (restartPending && Z_TYPE_P(restartPending) == IS_TRUE) {
        zval_ptr_dtor(&rv);
        return true;
    } else if (!restartPending || Z_TYPE_P(restartPending) != IS_FALSE) {
        ELASTIC_APM_LOG_DEBUG("opcache_get_status returned unexpected data ptr: %p t:%d", restartPending, restartPending ? Z_TYPE_P(restartPending) : -1);
    }

    zval_ptr_dtor(&rv);
    return false;
}