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(¶meters[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;
}