I had exactly the same problem. My website with ajax works perfectly in the localhost. but when i uploaded it to the server, I realized the ajax request where not workin returning the 500 internal error. And when i click the url it says that undefined variable.
Solution: Check the url of the ajax request:
before:
echo CHtml::textField('idsearch', '', array(
'onKeyUp' => CHtml::ajax(
array(
'type' => 'POST',
'dataType' => 'html',
'data' => array(
'id' => 'js:idsearch.value'),
'update' => '#dvfeeform',
'url' => CController::createUrl('student/searchajax'),
))
));
after editing the url to:
'url' => Yii::app()->createUrl('student/searchajax'),
it worked perfectly fine.
hope it may help someone someday
When an application finishes handling a request, it generates a response object
and sends it to the end user. The response object contains information such as the HTTP status code, HTTP headers and body.
The ultimate goal of Web application development is essentially to build such response objects upon various requests.
In most cases you should mainly deal with the response
application component
which is an instance of yiiwebResponse, by default. However, Yii also allows you to create your own response
objects and send them to end users as we will explain in the following.
In this section, we will describe how to compose and send responses to end users.
Status Code ¶
One of the first things you would do when building a response is to state whether the request is successfully handled.
This is done by setting the yiiwebResponse::$statusCode property which can take one of the valid
HTTP status codes. For example, to indicate the request
is successfully handled, you may set the status code to be 200, like the following:
Yii::$app->response->statusCode = 200;
However, in most cases you do not need to explicitly set the status code. This is because the default value
of yiiwebResponse::$statusCode is 200. And if you want to indicate the request is unsuccessful, you may
throw an appropriate HTTP exception like the following:
throw new yiiwebNotFoundHttpException;
When the error handler catches an exception, it will extract the status code
from the exception and assign it to the response. For the yiiwebNotFoundHttpException above, it is
associated with the HTTP status 404. The following HTTP exceptions are predefined in Yii:
- yiiwebBadRequestHttpException: status code 400.
- yiiwebConflictHttpException: status code 409.
- yiiwebForbiddenHttpException: status code 403.
- yiiwebGoneHttpException: status code 410.
- yiiwebMethodNotAllowedHttpException: status code 405.
- yiiwebNotAcceptableHttpException: status code 406.
- yiiwebNotFoundHttpException: status code 404.
- yiiwebServerErrorHttpException: status code 500.
- yiiwebTooManyRequestsHttpException: status code 429.
- yiiwebUnauthorizedHttpException: status code 401.
- yiiwebUnsupportedMediaTypeHttpException: status code 415.
If the exception that you want to throw is not among the above list, you may create one by extending
from yiiwebHttpException, or directly throw it with a status code, for example,
throw new yiiwebHttpException(402);
You can send HTTP headers by manipulating the header collection in the response
component.
For example,
$headers = Yii::$app->response->headers;
// add a Pragma header. Existing Pragma headers will NOT be overwritten.
$headers->add('Pragma', 'no-cache');
// set a Pragma header. Any existing Pragma headers will be discarded.
$headers->set('Pragma', 'no-cache');
// remove Pragma header(s) and return the removed Pragma header values in an array
$values = $headers->remove('Pragma');
Info: Header names are case insensitive. And the newly registered headers are not sent to the user until
the yiiwebResponse::send() method is called.
Response Body ¶
Most responses should have a body which gives the content that you want to show to end users.
If you already have a formatted body string, you may assign it to the yiiwebResponse::$content property
of the response. For example,
Yii::$app->response->content = 'hello world!';
If your data needs to be formatted before sending it to end users, you should set both of the
format and data properties. The format
property specifies in which format the data should be formatted. For example,
$response = Yii::$app->response;
$response->format = yiiwebResponse::FORMAT_JSON;
$response->data = ['message' => 'hello world'];
Yii supports the following formats out of the box, each implemented by a formatter class.
You can customize these formatters or add new ones by configuring the yiiwebResponse::$formatters property.
- HTML: implemented by yiiwebHtmlResponseFormatter.
- XML: implemented by yiiwebXmlResponseFormatter.
- JSON: implemented by yiiwebJsonResponseFormatter.
- JSONP: implemented by yiiwebJsonResponseFormatter.
- RAW: use this format if you want to send the response directly without applying any formatting.
While the response body can be set explicitly as shown above, in most cases you may set it implicitly by the return value
of action methods. A common use case is like the following:
public function actionIndex()
{
return $this->render('index');
}
The index
action above returns the rendering result of the index
view. The return value will be taken
by the response
component, formatted and then sent to end users.
Because by default the response format is HTML, you should only return a string
in an action method. If you want to use a different response format, you should set it first before returning the data.
For example,
public function actionInfo()
{
Yii::$app->response->format = yiiwebResponse::FORMAT_JSON;
return [
'message' => 'hello world',
'code' => 100,
];
}
As aforementioned, besides using the default response
application component, you can also create your own
response objects and send them to end users. You can do so by returning such object in an action method, like the following,
public function actionInfo()
{
return Yii::createObject([
'class' => 'yiiwebResponse',
'format' => yiiwebResponse::FORMAT_JSON,
'data' => [
'message' => 'hello world',
'code' => 100,
],
]);
}
Note: If you are creating your own response objects, you will not be able to take advantage of the configurations
that you set for theresponse
component in the application configuration. You can, however, use
dependency injection to apply a common configuration to your new response objects.
Browser Redirection ¶
Browser redirection relies on sending a Location
HTTP header. Because this feature is commonly used, Yii provides
some special support for it.
You can redirect the user browser to a URL by calling the yiiwebResponse::redirect() method. The method
sets the appropriate Location
header with the given URL and returns the response object itself. In an action method,
you can call its shortcut version yiiwebController::redirect(). For example,
public function actionOld()
{
return $this->redirect('https://example.com/new', 301);
}
In the above code, the action method returns the result of the redirect()
method. As explained before, the response
object returned by an action method will be used as the response sending to end users.
In places other than an action method, you should call yiiwebResponse::redirect() directly followed by
a chained call to the yiiwebResponse::send() method to ensure no extra content will be appended to the response.
Yii::$app->response->redirect('https://example.com/new', 301)->send();
Info: By default, the yiiwebResponse::redirect() method sets the response status code to be 302 which instructs
the browser that the resource being requested is temporarily located in a different URI. You can pass in a status
code 301 to tell the browser that the resource has been permanently relocated.
When the current request is an AJAX request, sending a Location
header will not automatically cause the browser
to redirect. To solve this problem, the yiiwebResponse::redirect() method sets an X-Redirect
header with
the redirection URL as its value. On the client-side, you may write JavaScript code to read this header value and
redirect the browser accordingly.
Info: Yii comes with a
yii.js
JavaScript file which provides a set of commonly used JavaScript utilities,
including browser redirection based on theX-Redirect
header. Therefore, if you are using this JavaScript file
(by registering the yiiwebYiiAsset asset bundle), you do not need to write anything to support AJAX redirection.
More information aboutyii.js
can be found in the Client Scripts Section.
Sending Files ¶
Like browser redirection, file sending is another feature that relies on specific HTTP headers. Yii provides
a set of methods to support various file sending needs. They all have built-in support for the HTTP range header.
- yiiwebResponse::sendFile(): sends an existing file to a client.
- yiiwebResponse::sendContentAsFile(): sends a text string as a file to a client.
- yiiwebResponse::sendStreamAsFile(): sends an existing file stream as a file to a client.
These methods have the same method signature with the response object as the return value. If the file
to be sent is very big, you should consider using yiiwebResponse::sendStreamAsFile() because it is more
memory efficient. The following example shows how to send a file in a controller action:
public function actionDownload()
{
return Yii::$app->response->sendFile('path/to/file.txt');
}
If you are calling the file sending method in places other than an action method, you should also call
the yiiwebResponse::send() method afterwards to ensure no extra content will be appended to the response.
Yii::$app->response->sendFile('path/to/file.txt')->send();
Some Web servers have a special file sending support called X-Sendfile. The idea is to redirect the
request for a file to the Web server which will directly serve the file. As a result, the Web application
can terminate earlier while the Web server is sending the file. To use this feature, you may call
the yiiwebResponse::xSendFile(). The following list summarizes how to enable the X-Sendfile
feature
for some popular Web servers:
- Apache: X-Sendfile
- Lighttpd v1.4: X-LIGHTTPD-send-file
- Lighttpd v1.5: X-Sendfile
- Nginx: X-Accel-Redirect
- Cherokee: X-Sendfile and X-Accel-Redirect
Sending Response ¶
The content in a response is not sent to the user until the yiiwebResponse::send() method is called.
By default, this method will be called automatically at the end of yiibaseApplication::run(). You can, however,
explicitly call this method to force sending out the response immediately.
The yiiwebResponse::send() method takes the following steps to send out a response:
- Trigger the yiiwebResponse::EVENT_BEFORE_SEND event.
- Call yiiwebResponse::prepare() to format response data into
response content. - Trigger the yiiwebResponse::EVENT_AFTER_PREPARE event.
- Call yiiwebResponse::sendHeaders() to send out the registered HTTP headers.
- Call yiiwebResponse::sendContent() to send out the response body content.
- Trigger the yiiwebResponse::EVENT_AFTER_SEND event.
After the yiiwebResponse::send() method is called once, any further call to this method will be ignored.
This means once the response is sent out, you will not be able to append more content to it.
As you can see, the yiiwebResponse::send() method triggers several useful events. By responding to
these events, it is possible to adjust or decorate the response.
Приветствую всех! Решил изучать vagrant и поднял на нем проект на yii2, все работало хорошо, но внезапно начала возникать ошибка 500 и никак не пойму причину. Сносил вагрант командой vagrant destroy и заново ставил vagrant up, но все равно ошибка 500. Прошу помочь понять причину возникновения этой ошибки и как исправить.
-
Вопрос заданболее трёх лет назад
-
1737 просмотров
http логи смотрим от сервера, затем от php.
смотрим также логи от приложения runtime/log/app.log.
также берем каждый запрос к бд и анализируем через explain наверняка индекса нету на большой таблице.
можно поставить newrealic или ему подобный мониторинг и найти все что тормозит еще быстрей.
Пригласить эксперта
Спасибо за ответы, посмотрел в логах, ошибка была в синтаксисе написанных мной файлов, исправил ошибки , сделал vagrant up и заработало
-
Показать ещё
Загружается…
03 июн. 2023, в 19:30
500 руб./за проект
03 июн. 2023, в 19:30
750 руб./в час
03 июн. 2023, в 19:06
2000 руб./за проект
Минуточку внимания
Стояло приложение Yii2 бэсик на сервере на всякий случай сообщаю php в консоли 5.4.16
перенес приложение на другой сервер, структура папок начинаю от корня / та же самая. на новом сервере php в консоли 5.3.3
база данных тоже перенсена.
На новом сервере получаю ошибку 500. если убрать htaccess пойти по прямому пути к индексному файлу приложения то он запускается криво, автолоадер подключается но на последней строке index.php где запускается приложение выскакивает 500ка
думал криво переписал файлы. переписал еще раз с сервера на сервер через scp, все четко переписано минуя загрузку на локальную машину, а ошибка все равно вылетает.
Куда смотреть я уже все логи и апача и php и что там еще есть сервака посмотрел. там нет ни единого намека на причину ошибки.
htaccess такой
Код: Выделить всё
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
# Если запрос не начинается с web, добавляем его
RewriteCond %{REQUEST_URI} !^/(yii2-app-basic)
RewriteRule (.*) yii2-app-basic/web/$1
# Если файл или каталог не существует, идём к yii2-app-basic/web/index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . yii2-app-basic/web/index.php
Направьте пожалуйста.
Спасибо!
Обработка ошибок
Если при обработке запроса к RESTful API в запросе пользователя обнаруживается ошибка или происходит
что-то непредвиденное на сервере, вы можете просто выбрасывать исключение, чтобы уведомить пользователя о нештатной ситуации.
Если вы можете установить конкретную причину ошибки (например, запрошенный ресурс не существует), вам следует подумать
о том, чтобы выбрасывать исключение с соответствующим кодом состояния HTTP (например, [[yiiwebNotFoundHttpException]],
соответствующее коду состояния 404). Yii отправит ответ с соответствующим
HTTP-кодом и текстом. Он также включит в тело ответа сериализованное представление
исключения. Например:
HTTP/1.1 404 Not Found
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
Сводный список кодов состояния HTTP, используемых REST-фреймворком Yii:
200
: OK. Все сработало именно так, как и ожидалось.201
: Ресурс был успешно создан в ответ наPOST
-запрос. ЗаголовокLocation
содержит URL, указывающий на только что созданный ресурс.204
: Запрос обработан успешно, и в ответе нет содержимого (для запросаDELETE
, например).304
: Ресурс не изменялся. Можно использовать закэшированную версию.400
: Неверный запрос. Может быть связано с разнообразными проблемами на стороне пользователя, такими как неверные JSON-данные
в теле запроса, неправильные параметры действия, и т.д.401
: Аутентификация завершилась неудачно.403
: Аутентифицированному пользователю не разрешен доступ к указанной точке входа API.404
: Запрошенный ресурс не существует.405
: Метод не поддерживается. Сверьтесь со списком поддерживаемых HTTP-методов в заголовкеAllow
.415
: Не поддерживаемый тип данных. Запрашивается неправильный тип данных или номер версии.422
: Проверка данных завершилась неудачно (в ответе наPOST
-запрос, например). Подробные сообщения об ошибках смотрите в теле ответа.429
: Слишком много запросов. Запрос отклонен из-за превышения ограничения частоты запросов.500
: Внутренняя ошибка сервера. Возможная причина — ошибки в самой программе.
Свой формат ответа с ошибкой
Вам может понадобиться изменить формат ответа с ошибкой. Например, вместо использования разных статусов ответа HTTP
для разных ошибок, вы можете всегда отдавать статус 200, а реальный код статуса отдавать как часть JSON ответа:
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"success": false,
"data": {
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
}
Для этого можно использовать событие beforeSend
компонента response
прямо в конфигурации приложения:
return [ // ... 'components' => [ 'response' => [ 'class' => 'yiiwebResponse', 'on beforeSend' => function ($event) { $response = $event->sender; if ($response->data !== null && !empty(Yii::$app->request->get('suppress_response_code'))) { $response->data = [ 'success' => $response->isSuccessful, 'data' => $response->data, ]; $response->statusCode = 200; } }, ], ], ];
Приведённый выше код изменит формат ответа (как для удачного запроса, так и для ошибок) если передан GET
-параметр
suppress_response_code
.