I figured out one solution, but would still welcome others related to recorderjs.  I used MP3RecorderJS at https://github.com/icatcher-at/MP3RecorderJS.  The demo html works if you change the top of the html from src="js/jquery.min.js" and src="js/mp3recorder.js" to wherever they're located in your server.  For me, it is src="jquery.min.js" and src="mp3recorder.js"  I also had to do the same thing to the "mp3recorder.js" file: var RECORDER_WORKER_PATH  = 'js/recorderWorker.js'; var ENCODER_WORKER_PATH   = 'js/mp3Worker.js'; changed to var RECORDER_WORKER_PATH  = 'recorderWorker.js';  var ENCODER_WORKER_PATH   = 'mp3Worker.js';
The program is set up to record both mp3 and wav.  I wanted wav, so I made a few more adjustments to the html file.  At line 55 you'll find:
recorderObject.exportMP3(function(base64_mp3_data) {
      var url = 'data:audio/mp3;base64,' + base64_mp3_data;
      var au  = document.createElement('audio'); 
I changed that to:
recorderObject.exportWAV(function(base64_wav_data) {
      var url = 'data:audio/wav;base64,' + base64_wav_data;
      var au  = document.createElement('audio');   
The demo appends a new player each time you record.  To prevent this, I deleted (commented out) the $recorder.append(au); part, made a new div to store the audio player, and then I clear that div each time, before the audio player is created.  To upload to my server, I used a technique I learned from uploading images to a server save canvas image to server  Basically, the "url" variable in line 56 was what I needed, but couldn't figure out how to put it in a universal variable to use by another function.  So, I made a hidden div and made the contents of it equal to "url".  I then referenced that div in a new function called "upload".  I then used a php file called "uploadWav.php".  I still have to figure out a way to activate and deactivate the upload button to prevent the user from uploading a blank file before recording, but that's another issue. Here's the final html and php that worked for me:
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>MP3 Recorder test</title>
  </head>
  <body id="index" onload="">
    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript" src="mp3recorder.js"></script>
    <script type="text/javascript">
    var audio_context;
    function __log(e, data) {
      log.innerHTML += "\n" + e + " " + (data || '');
    }
    $(function() {
      try {
    // webkit shim
    window.AudioContext = window.AudioContext || window.webkitAudioContext;
    navigator.getUserMedia = ( navigator.getUserMedia ||
                     navigator.webkitGetUserMedia ||
                     navigator.mozGetUserMedia ||
                     navigator.msGetUserMedia);
    window.URL = window.URL || window.webkitURL;
    var audio_context = new AudioContext;
    __log('Audio context set up.');
    __log('navigator.getUserMedia ' + (navigator.getUserMedia ? 'available.' : 'not  present!'));
  } catch (e) {
    alert('No web audio support in this browser!');
  }
  $('.recorder .start').on('click', function() {
    $this = $(this);
    $recorder = $this.parent();
    navigator.getUserMedia({audio: true}, function(stream) {
      var recorderObject = new MP3Recorder(audio_context, stream, { statusContainer:  $recorder.find('.status'), statusMethod: 'replace' });
      $recorder.data('recorderObject', recorderObject);
      recorderObject.start();
    }, function(e) { });
  });
  $('.recorder .stop').on('click', function() {
    $this = $(this);
    $recorder = $this.parent();
    recorderObject = $recorder.data('recorderObject');
    recorderObject.stop();
    recorderObject.exportWAV(function(base64_wav_data) {
      var url = 'data:audio/wav;base64,' + base64_wav_data;
      var au  = document.createElement('audio');
      document.getElementById("playerContainer").innerHTML = "";
      //console.log(url)
      var duc = document.getElementById("dataUrlcontainer");
      duc.innerHTML = url;
      au.controls = true;
      au.src = url;
      //$recorder.append(au);
      $('#playerContainer').append(au);
      recorderObject.logStatus('');
    });
  });
  });
  </script>
 <script>
    function upload(){
    var dataURL = document.getElementById("dataUrlcontainer").innerHTML;
      $.ajax({
      type: "POST",
      url: "uploadWav.php",
      data: { 
          wavBase64: dataURL
       }
    }).done(function(o) {
      console.log('saved'); 
      });
    }    
  </script>
 <div class="recorder">
  Recorder 1
  <input type="button" class="start"  value="Record" />
  <input type="button" class="stop" value="Stop" />
  <pre class="status"></pre>
 </div>
 <div><button onclick="upload()">Upload</button></div>
 <div id="playerContainer"></div>
 <div id="dataUrlcontainer" hidden></div>
 <pre id="log"></pre>
 </body>
 </html>
and the "uploadWav.php" file:
<?php
// requires php5
define('UPLOAD_DIR', 'uploads/');
$img = $_POST['wavBase64'];
$img = str_replace('data:audio/wav;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
$file = UPLOAD_DIR . uniqid() . '.wav';
$success = file_put_contents($file, $data);
print $success ? $file : 'Unable to save the file.';
?>