AngularJS和PHP会在每个请求中创建新会话

AngularJS和PHP会在每个请求中创建新会话,php,angularjs,session,silex,Php,Angularjs,Session,Silex,我正在尝试使用Silex创建RESTAPI。它工作得很好,但现在我想使用会话变量来跟踪用户。我尝试使用常规php会话变量和SessionServiceProvider。在我的一生中,会话变量不会在页面请求上持久化。查看“我的临时会话”文件夹,似乎每个请求都会创建一个新会话 所以我在index.php文件中包含了许多php文件,其中$app是初始化的?我不确定这是否与此有关,但这可能有助于理解下面的代码所做的事情 index.php <?php require_once 'vendor/a

我正在尝试使用Silex创建RESTAPI。它工作得很好,但现在我想使用会话变量来跟踪用户。我尝试使用常规php会话变量和SessionServiceProvider。在我的一生中,会话变量不会在页面请求上持久化。查看“我的临时会话”文件夹,似乎每个请求都会创建一个新会话

所以我在index.php文件中包含了许多php文件,其中$app是初始化的?我不确定这是否与此有关,但这可能有助于理解下面的代码所做的事情

index.php

<?php

require_once 'vendor/autoload.php';

$config['displayErrorDetails'] = true;

$app = new Silex\Application();
$app->register(new Silex\Provider\SessionServiceProvider, array('session.storage.save_path' => dirname(__DIR__) . '/tmp'));

$app->before(function() use ($app){
    $app['session']->start();
});

require "../apiSource/classes/employees.php";
$app->run();
$app->get('/hello', function () use ($app){
    session_start();
    $num = $_SESSION['idea'] ? $_SESSION['idea'] : 1;
    $_SESSION['idea'] =  $num+1;
    echoResponse(200, $_SESSION['idea']);
});
如果我只是访问那个页面并不断点击刷新,我的会话变量正在工作,并且它不断地上升1。因此会话变量正在工作

但是,当我尝试从angular应用程序调用此页面时:

$scope.hello = function(){
  $http.get('https://viromo.com/cubex/api/hello').then(function(results){
    console.log(results);
  })
};
结果会不断发回相同的数字,但不会增加。不知道为什么会这样。我已经更新了标题和标签,以更好地反映我的问题目标


谢谢

在我的例子中,这是因为在请求头中设置cookie的配置丢失了

据此: 默认情况下,在跨站点XMLHttpRequest或Fetch调用中,浏览器不会发送凭据。调用XMLHttpRequest对象或请求构造函数时,必须在其上设置特定标志

在angular中,通过添加配置行来完成:

angular.module('app', ['your_dependencies...'])
.config(function ($httpProvider) {
    // Enabling the use of cookies in angular
    $httpProvider.defaults.withCredentials = true;
});
如果使用Apache托管后端,则可能需要编辑“.htaccess”,通过添加以下行允许使用凭据:

# When using credentials flag, the wildcard '*' does not work, so you need to specify the site URL
Header always set Access-Control-Allow-Origin http://<your_site_url>
# Allowing credentials
Header always set Access-Control-Allow-Credentials true
#使用凭据标志时,通配符“*”无效,因此需要指定站点URL
标头始终设置访问控制允许源http://
#允许凭据
标头始终将访问控制允许凭据设置为true

可能是Cookie被禁用。您是否使用浏览器上的开发工具检查了PHPSESSID?页面之间的值是否更改?您是否尝试从中间件中删除$app['session']->start()?不幸的是,cookies被启用了,PHPSESSID每次都会得到一个新的var,并且删除会话启动没有帮助
# When using credentials flag, the wildcard '*' does not work, so you need to specify the site URL
Header always set Access-Control-Allow-Origin http://<your_site_url>
# Allowing credentials
Header always set Access-Control-Allow-Credentials true